JavaRush /Blog Java /Random-VI /XML trong Java: Nó là gì?

XML trong Java: Nó là gì?

Xuất bản trong nhóm
Xin chào! Hôm nay chúng ta sẽ làm quen với một định dạng dữ liệu khác gọi là XML. Đây là một chủ đề rất quan trọng. Khi làm việc trên các ứng dụng Java thực tế, bạn gần như chắc chắn sẽ gặp phải các vấn đề liên quan đến XML. Định dạng này được sử dụng hầu hết ở mọi nơi trong quá trình phát triển Java (chúng ta sẽ tìm hiểu lý do chính xác bên dưới), vì vậy tôi khuyên bạn không nên đọc bài giảng theo đường chéo mà hãy hiểu kỹ mọi thứ và đồng thời nghiên cứu thêm tài liệu/liên kết :) Định dạng này thời gian chắc chắn sẽ không bị lãng phí. Vì vậy, hãy bắt đầu với những câu đơn giản - “cái gì” và “tại sao”!

XML là gì?

XML là viết tắt của Ngôn ngữ đánh dấu có thể mở rộng. Bạn có thể đã quen thuộc với một trong các ngôn ngữ đánh dấu: bạn đã nghe nói về HTML, ngôn ngữ được sử dụng để tạo các trang web :) XML là gì - 1HTML và XML thậm chí có hình thức tương tự nhau:
HTML 1
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1
<headline>title</headline>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
HTML 2
<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2
<chief>title</chief>
<paragraph>paragraph</paragraph>
<paragraph>paragraph</paragraph>
Nói cách khác, XML là ngôn ngữ mô tả dữ liệu.

Tại sao cần có XML?

XML ban đầu được phát minh để lưu trữ và truyền dữ liệu thuận tiện hơn, bao gồm cả qua Internet. Nó có một số lợi thế cho phép nó đối phó thành công với nhiệm vụ này. Đầu tiên, nó dễ đọc bởi cả con người và máy tính. Tôi nghĩ bạn có thể dễ dàng hiểu tệp xml này mô tả gì:
<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Máy tính cũng dễ dàng hiểu được định dạng này. Thứ hai, vì dữ liệu được lưu trữ ở định dạng văn bản đơn giản nên sẽ không có vấn đề về khả năng tương thích khi truyền dữ liệu từ máy tính này sang máy tính khác. Điều quan trọng là phải hiểu rằng XML không phải là mã thực thi mà là ngôn ngữ mô tả dữ liệu . Sau khi bạn đã mô tả dữ liệu bằng XML, bạn cần viết mã (ví dụ: bằng Java) để có thể gửi/nhận/xử lý dữ liệu này.

XML hoạt động như thế nào?

Thành phần chính của nó là các thẻ: đây là những thứ nằm trong dấu ngoặc nhọn:
<book>
</book>
Có thẻ mở và thẻ đóng. Phần kết thúc có một ký hiệu bổ sung - “ /”, điều này có thể được thấy trong ví dụ trên. Mỗi thẻ mở phải có một thẻ đóng tương ứng. Chúng hiển thị nơi bắt đầu và kết thúc mô tả của từng thành phần trong tệp. Thẻ có thể được lồng vào nhau! Trong ví dụ về sách của chúng tôi, thẻ <book> có 3 thẻ phụ - <title> , <author><year> . Điều này không giới hạn ở một cấp độ: thẻ phụ có thể có thẻ phụ riêng, v.v. Thiết kế này được gọi là cây thẻ. Hãy xem cái cây bằng ví dụ về tệp XML có mô tả về một đại lý ô tô:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Ở đây chúng tôi có thẻ cấp cao nhất - <carstore> . Nó còn được gọi là “root” - thẻ gốc. <carstore> có một thẻ con, <car>. Ngược lại, <car> cũng có 3 thẻ con của riêng nó - <model>, <year> và <price>. Mỗi thẻ có thể có thuộc tính - thông tin quan trọng bổ sung. Trong ví dụ của chúng tôi, thẻ <model> có thuộc tính “lang” - ngôn ngữ viết tên của mô hình:
<model lang="en">Scania R 770</model>
Bằng cách này, chúng tôi có thể chỉ ra rằng tiêu đề được viết bằng tiếng Anh. Thẻ <price> của chúng tôi có thuộc tính “tiền tệ”.
<price currency="US dollar">150000.00</price>
Bằng cách này, chúng ta có thể chỉ ra rằng giá của chiếc xe được tính bằng đô la Mỹ. Do đó, XML có cú pháp "tự mô tả" . Bạn có thể thêm bất kỳ thông tin nào bạn cần để mô tả dữ liệu. Bạn cũng có thể thêm một dòng ở đầu tệp cho biết phiên bản XML và mã hóa mà dữ liệu được ghi. Nó được gọi là " prolog " và trông như thế này:
<?xml version="1.0" encoding="UTF-8"?>
Chúng tôi sử dụng mã hóa XML phiên bản 1.0 và UTF-8. Điều này là không cần thiết nhưng có thể hữu ích nếu chẳng hạn như bạn sử dụng văn bản bằng các ngôn ngữ khác nhau trong tệp của mình. Chúng tôi đã đề cập rằng XML là viết tắt của “ngôn ngữ đánh dấu có thể mở rộng”, nhưng “có thể mở rộng” nghĩa là gì? Điều này có nghĩa là nó hoàn toàn phù hợp để tạo các phiên bản mới của đối tượng và tệp của bạn. Ví dụ: chúng tôi muốn phòng trưng bày ô tô của mình cũng bắt đầu bán xe máy! Đồng thời, trong chương trình chúng tôi cần hỗ trợ cả hai phiên bản <carstore> - cả phiên bản cũ (không có xe máy) và phiên bản mới. Đây là phiên bản cũ của chúng tôi:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Và đây là cái mới, mở rộng:
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
Thật dễ dàng và đơn giản, chúng tôi đã thêm mô tả về xe máy vào tệp của mình :) Đồng thời, chúng tôi hoàn toàn không cần đặt các thẻ con giống nhau cho xe máy như cho ô tô. Xin lưu ý rằng xe máy, không giống như ô tô, có phần tử <owner> - chủ sở hữu. Điều này sẽ không ngăn máy tính (hoặc một người) đọc dữ liệu.

Sự khác biệt giữa XML và HTML

Chúng tôi đã nói rằng XML và HTML có hình thức rất giống nhau. Vì vậy, điều rất quan trọng là phải biết chúng khác nhau như thế nào. Thứ nhất, chúng được sử dụng cho các mục đích khác nhau. HTML - để đánh dấu các trang web. Ví dụ: nếu bạn cần tạo một trang web, sử dụng HTML, bạn có thể chỉ định: “Menu phải ở góc trên cùng bên phải. Nó phải có những nút như thế này, thế kia.” Nói cách khác, mục đích của HTML là hiển thị dữ liệu. XML - để lưu trữ và truyền thông tin dưới dạng thuận tiện cho con người và máy tính. Định dạng này không chứa bất kỳ hướng dẫn nào về cách hiển thị dữ liệu này: nó phụ thuộc vào mã của chính chương trình. Thứ hai, họ có sự khác biệt chính về mặt kỹ thuật. Thẻ HTML được xác định trước. Nói cách khác, để tạo một tiêu đề (ví dụ: một dòng chữ lớn ở đầu trang), chỉ các thẻ <h1></h1> được sử dụng trong HTML (đối với các tiêu đề nhỏ hơn - <h2></h2>, < h3></h3>). Bạn sẽ không thể tạo tiêu đề trong HTML bằng cách sử dụng các thẻ có tiêu đề khác nhau. XML không sử dụng các thẻ được xác định trước. Bạn có thể đặt cho các thẻ bất kỳ tên nào bạn muốn - <header>, <title>, <idontknow2121>.

giải quyết xung đột

Sự tự do mà XML cung cấp cũng có thể dẫn đến một số vấn đề. Ví dụ: cùng một thực thể (ví dụ: một chiếc ô tô) có thể được một chương trình sử dụng cho các mục đích khác nhau. Ví dụ: chúng tôi có tệp XML mô tả máy móc. Tuy nhiên, các lập trình viên của chúng tôi đã không đồng ý trước với nhau. Và bây giờ, ngoài dữ liệu từ ô tô thật, xml của chúng tôi còn bao gồm dữ liệu từ các mô hình đồ chơi! Hơn nữa, chúng có những thuộc tính giống nhau. Chương trình của chúng tôi nhận được tệp XML sau. Làm thế nào chúng ta có thể phân biệt được một chiếc ô tô thật với một mô hình đồ chơi?
<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
Tiền tố và không gian tên sẽ giúp chúng ta ở đây. Để phân biệt ô tô đồ chơi với ô tô thật trong chương trình của chúng tôi (và nói chung, bất kỳ đồ chơi nào khỏi nguyên mẫu thật của chúng), chúng tôi giới thiệu hai tiền tố - “thật” và “đồ chơi”.
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
Bây giờ chương trình của chúng ta sẽ có thể phân biệt giữa các thực thể! Bất cứ thứ gì có tiền tố đồ chơi sẽ được phân loại là đồ chơi :) Tuy nhiên, chúng ta vẫn chưa kết thúc. Để sử dụng tiền tố, chúng ta cần đăng ký từng tiền tố dưới dạng một không gian tên. Thực ra, “đăng ký” là một từ mạnh :) Bạn chỉ cần nghĩ ra một cái tên duy nhất cho mỗi người trong số họ. Giống như các lớp: một lớp có tên viết tắt ( Cat) và tên đầy đủ với tất cả các gói ( zoo.animals.Cat) Để tạo các không gian tên duy nhất, URI thường được sử dụng . Đôi khi địa chỉ Internet được thay thế ở đây, nơi các chức năng và mục đích của không gian tên này được mô tả chi tiết. Nhưng đây không nhất thiết phải là địa chỉ Internet hợp lệ. Thông thường, các dự án chỉ đơn giản sử dụng các chuỗi giống URI để giúp theo dõi thứ bậc của các không gian tên. Đây là một ví dụ:
<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
Tất nhiên, không có trang web nào trên Internet có địa chỉ http://testproject.developersgroup1.companyname/department2/namespaces/real Nhưng có thông tin hữu ích: nhóm nhà phát triển “developersgroup1” từ bộ phận “department2” chịu trách nhiệm tạo không gian tên "thực". Nếu bạn cần thêm tên mới hoặc thảo luận về những xung đột có thể xảy ra với họ, chúng tôi biết phải liên hệ ở đâu. Đôi khi một địa chỉ Internet thực có mô tả về không gian tên này được sử dụng làm tên duy nhất cho một không gian tên. Ví dụ: nếu đó là một công ty lớn và dự án của nó sẽ được hàng triệu người trên thế giới sử dụng. Nhưng điều này không phải lúc nào cũng được thực hiện: có một cuộc thảo luận về vấn đề này trên Stackoverflow . Về nguyên tắc, yêu cầu sử dụng URI làm tên cho vùng tên không nghiêm ngặt: bạn chỉ có thể sử dụng các chuỗi ngẫu nhiên. Tùy chọn này cũng sẽ hoạt động:
xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Nhưng có một số lợi ích khi sử dụng URI. Bạn có thể đọc thêm về điều này ở đây .

Tiêu chuẩn XML cốt lõi

Các tiêu chuẩn XML là một tập hợp các tiện ích mở rộng bổ sung thêm chức năng cho các tệp xml. XML có rất nhiều tiêu chuẩn, nhưng chúng ta sẽ chỉ xem xét những tiêu chuẩn quan trọng nhất và tìm hiểu xem chúng cho phép AJAX , một trong những tiêu chuẩn XML nổi tiếng nhất, thực hiện những gì. Nó cho phép bạn thay đổi nội dung của trang web mà không cần tải lại! Nghe hay đấy? :) Bạn có thể trực tiếp thử công nghệ này tại đây . XSLT - cho phép bạn chuyển đổi văn bản XML sang các định dạng khác. Ví dụ: sử dụng XSLT, bạn có thể chuyển đổi XML thành HTML! Mục đích của XML, như chúng tôi đã nói, là mô tả dữ liệu chứ không phải để hiển thị nó. Nhưng sử dụng XSLT chúng ta có thể vượt qua giới hạn này! Đây là một hộp cát với một ví dụ hoạt động, nơi bạn có thể tự mình xem nó hoạt động như thế nào :) XML DOM - cho phép bạn lấy, thay đổi, thêm hoặc xóa các phần tử riêng lẻ khỏi tệp XML. Đây là một ví dụ nhỏ về cách nó hoạt động. Chúng tôi có tệp books.xml:
<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
Có hai cuốn sách trong đó. Sách có thành phần như tiêu đề - <title>. Và ở đây, chúng ta có thể sử dụng JavaScript để lấy tất cả tên sách từ tệp XML của mình và xuất đầu tiên trong số chúng ra bảng điều khiển:
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
Một lần nữa, tôi khuyên bạn nên xem ví dụ này hoạt động như thế nào bằng cách sử dụng hộp cát :) DTD (“định nghĩa loại tài liệu”) - cho phép bạn xác định danh sách các phần tử được phép cho một số thực thể trong tệp XML. Ví dụ: chúng tôi đang làm việc trên một trang web của hiệu sách và tất cả các nhóm phát triển đã đồng ý rằng đối với thành phần sách, chỉ có các thuộc tính tên sách, tác giả và năm mới được chỉ định trong các tệp XML. Nhưng làm thế nào chúng ta có thể bảo vệ mình khỏi sự thiếu chú ý? Rất dễ!
<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
Ở đây chúng tôi đã xác định danh sách các thuộc tính hợp lệ cho <book>. Hãy thử thêm một phần tử mới vào đó và bạn sẽ gặp lỗi ngay lập tức!
<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Lỗi! “Phần tử mainhero không được phép ở đây” Có nhiều tiêu chuẩn XML khác. Bạn có thể làm quen với từng người trong số họ và cố gắng tìm hiểu sâu hơn về mã trên trang web WC3 (phần “Các tiêu chuẩn XML quan trọng”). Và nói chung, nếu bạn cần thông tin về XML, bạn có thể tìm thấy hầu hết mọi thứ ở đó :) Chà, bài giảng của chúng ta đã kết thúc. Đã đến lúc quay lại với nhiệm vụ! :) Thấy bạn!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION