XML trong Java

Xuất bản trong nhóm
CHÀO! Hôm nay chúng tôi sẽ giới thiệu 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ế, gần như chắc chắn bạn sẽ gặp các tác vụ liên quan đến XML. Trong quá trình phát triển Java, định dạng này được sử dụng gần như phổ biến (chúng ta sẽ tìm hiểu lý do tại sao bên dưới), vì vậy tôi khuyên bạn không nên xem lại bài học này một cách hời hợt mà hãy hiểu thấu đáo mọi thứ và cũng nghiên cứu thêm tài liệu/liên kết :) Điều này chắc chắn sẽ không lãng phí thời gian. Vì vậy, hãy bắt đầu với những thứ dễ dàng: "cái gì" và "tại sao"!

Java XML là gì?

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

Tại sao bạn cần XML?

XML ban đầu được phát minh để lưu trữ và gửi dữ liệu thuận tiện hơn, kể cả qua Internet. Nó có một số lợi thế giúp bạn đạt được điều này. Đầu tiên, nó rất 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ả điều 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 định dạng này. Thứ hai, vì dữ liệu được lưu trữ dưới dạng văn bản thuần túy nên sẽ không có vấn đề về tính tương thích khi chúng tôi chuyể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 — đó 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 được cấu trúc như thế nào?

Thành phần chính là thẻ: đây là những thứ trong ngoặc đơn:
<book>
</book>
Có thẻ mở và thẻ đóng. Thẻ đóng có một ký hiệu bổ sung (" / "), như có thể thấy trong ví dụ trên. Mỗi thẻ mở phải có một thẻ đóng. Chúng hiển thị vị trí bắt đầu và kết thúc mô tả của từng phần tử trong tệp. Các thẻ có thể được lồng vào nhau! Trong ví dụ sách của chúng tôi, thẻ <book> có 3 thẻ lồng nhau: <title>, <author> và <year>. Điều này không giới hạn ở một cấp độ lồng nhau: các thẻ lồng nhau có thể có các thẻ lồng riêng của chúng, v.v. Cấu trúc này được gọi là cây thẻ. Hãy xem cây này bằng tệp XML mẫu mô tả một đại lý xe hơ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>
Ở đây chúng tôi có một thẻ cấp cao nhất: <carstore>. Nó còn được gọi là phần tử gốc. <carstore> có một thẻ con: <car>. <car> lần lượt cũng có 3 thẻ con là <model>, <year> và <price>. Mỗi thẻ có thể có các thuộc tính chứa 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", cho biết ngôn ngữ được sử dụng để ghi tên mô hình:
<model lang="en">Scania R 770</model>
Ở đây chúng tôi chỉ ra rằng tên đượ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>
Ở đây chúng tôi chỉ ra rằng giá của chiếc xe được đưa ra 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. Ngoài ra, ở đầu tệp, bạn có thể thêm một dòng cho biết phiên bản XML và mã hóa được sử dụng để ghi dữ liệu. Đây được gọi là "prolog" và nó trông như thế này:
<?xml version="1.0" encoding="UTF-8"?>
Chúng tôi đang sử dụng mã hóa XML phiên bản 1.0 và UTF-8. Điều này không cần thiết, nhưng nó có thể hữu ích nếu chẳng hạn như tệp của bạn sử dụng văn bản ở các ngôn ngữ khác nhau. Chúng tôi đã đề cập rằng XML có nghĩa là "Ngôn ngữ đánh dấu có thể mở rộng", nhưng "có thể mở rộng" có nghĩa là gì? Điều này có nghĩa là nó hoàn hảo để tạo các phiên bản mới của các đối tượng và tệp của bạn. Ví dụ: giả sử chúng tôi cũng muốn bắt đầu bán xe máy tại đại lý ô tô của mình! Điều đó nói rằng, chúng tôi cần chương trình của chúng tôi cần hỗ trợ cả hai phiên bản <carstore>: 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 được 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>
Đó là cách dễ dàng và đơn giản để thêm mô tả về xe máy vào tệp của chúng tôi :) Hơn nữa, chúng ta hoàn toàn không cần phải có các thẻ con giống nhau cho xe máy cũng như cho ô tô. Xin lưu ý rằng xe máy, không giống như ô tô, có phần tử <chủ sở hữu>. Điều này không ngăn máy tính (hoặc con 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ó bề ngoài rất giống nhau. Điều đó làm cho nó rất quan trọng để biết làm thế nào họ khác nhau. Đầu tiên, chúng được sử dụng cho các mục đích khác nhau. HTML là để đánh dấu các trang web. Ví dụ: khi tạo trang web, bạn có thể sử dụng HTML để chỉ định: "Menu phải ở góc trên bên phải. Nó phải có các nút như vậy". Nói cách khác, công việc của HTML là hiển thị dữ liệu. XML dùng để lưu trữ và gửi thông tin ở 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ỳ dấu hiệu nào về cách dữ liệu này sẽ được hiển thị: điều đó phụ thuộc vào mã của chương trình đọc nó. Thứ hai, có một sự khác biệt lớn về kỹ thuật. Các thẻ HTML được xác định trước. Nói cách khác, việc tạo tiêu đề HTML (ví dụ: chú thích lớn ở đầu trang) chỉ sử dụng <h1></h1> thẻ (<h2></h2> và <h3></h3> được sử dụng cho các tiêu đề nhỏ hơn). Bạn không thể tạo tiêu đề HTML bằng các thẻ khác. 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ó thể dẫn đến một số vấn đề. Ví dụ: một và cùng một thực thể (ví dụ: ô tô) có thể được sử dụng bởi một chương trình cho các mục đích khác nhau. Ví dụ: chúng tôi có tệp XML mô tả ô tô. Tuy nhiên, các lập trình viên của chúng tôi đã không đạt được thỏa thuận trước với nhau. Và bây giờ, ngoài dữ liệu về ô tô thật, chúng ta có thể tìm thấy dữ liệu về ô tô đồ chơi trong XML của mình! Hơn nữa, chúng có cùng thuộc tính. Giả sử chương trình của chúng ta đọc một tệp XML như vậy. Làm thế nào để phân biệt xe thật với xe đồ 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>
Ở đây tiền tố và không gian tên sẽ giúp chúng tôi. Để phân biệt ô tô đồ chơi với ô tô thật trong chương trình của chúng tôi (và thực tế là bất kỳ đồ chơi nào với ô tô thực của chúng), chúng tôi giới thiệu hai tiền tố: "thực" 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ể khác nhau! Mọi thứ có tiền tố đồ chơi sẽ được coi là đồ chơi :) Tuy nhiên, chúng tôi vẫn chưa hoàn thành. Để sử dụng các 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. Trên thực tế, "đăng ký" là một từ mạnh :) Chúng ta chỉ cần nghĩ ra một tên duy nhất cho mỗi người trong số họ. Nó giống như với các lớp: một lớp có một tên ngắn ( Cat ) và một tên đủ điều kiện bao gồm tất cả các gói ( zoo.animals.Cat). Một URI thường được sử dụng để tạo một tên không gian tên duy nhất. Đôi khi điều này được thực hiện bằng cách sử dụng địa chỉ Internet, nơi các chức năng của không gian tên này được mô tả. Nhưng nó không phải là một địa chỉ Internet hợp lệ. Thông thường, các dự án chỉ cần sử dụng các chuỗi giống như URI giúp theo dõi phân cấp 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 tại "http://testproject.developersgroup1.companyname/department2/namespaces/real" Nhưng chuỗi này chứa thông tin hữu ích: các nhà phát triển của Nhóm 1 trong Phòng 2 chịu trách nhiệm tạo không gian tên "thực" . Nếu chúng ta cần giới thiệu những cái tên mới hoặc thảo luận về những xung đột có thể xảy ra, chúng ta sẽ biết phải xoay sở ở đâu. Đôi khi các nhà phát triển sử dụng địa chỉ web mô tả thực làm tên không gian tên duy nhất. Ví dụ: đây có thể là trường hợp của một công ty lớn có dự án sẽ được hàng triệu người trên thế giới sử dụng. Nhưng điều này chắc chắn không phải lúc nào cũng được thực hiện: Stack Overflow có một cuộc thảo luận về vấn đề này. Nói chung, không có yêu cầu nghiêm ngặt nào để sử dụng URI làm tên không gian tên: bạn cũng có thể chỉ cần 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"
Điều đó nói rằng, sử dụng URI có một số lợi thế. Bạn có thể đọc thêm về điều này ngay tại đây .

Các chuẩn XML cơ bản

Các tiêu chuẩn XML là một tập hợp các phần 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à khám phá ra rằng chúng giúp AJAX khả thi, đây là một trong những tiêu chuẩn XML nổi tiếng nhất. Nó cho phép bạn thay đổi nội dung của trang web mà không cần tải lại! XSLT cho phép bạn chuyển đổi văn bản XML sang các định dạng khác. Ví dụ: bạn có thể sử dụng XSLT để chuyển đổi XML sang HTML! Như chúng tôi đã nói, mục đích của XML là để mô tả dữ liệu, không phải để hiển thị nó. Nhưng với XSLT, chúng ta có thể khắc phục hạn chế này! XML DOM cho phép bạn truy xuất, sửa đổi, thêm hoặc xóa các phần tử riêng lẻ khỏi một tệp XML. Đây là một ví dụ nhỏ về cách thức hoạt động của nó. Chúng tôi có một tệp sách.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>
Nó có hai cuốn sách. Sách có phần tử <title>. Ở đâ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à in tên sách đầu tiên 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>
DTD ("định nghĩa loại tài liệu") cho phép bạn xác định danh sách các thành phần được phép cho một thực thể trong tệp XML. Ví dụ: giả sử chúng ta đang làm việc trên một trang web hiệu sách và tất cả các nhóm phát triển đều đồng ý rằng chỉ nên chỉ định các thuộc tính tiêu đề, tác giả và năm cho các thành phần sách trong tệp XML. Nhưng làm thế nào để chúng ta tự bảo vệ mình khỏi sự bất cẩn? 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 ta đã định nghĩa một 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! "Yếu tố chính không được phép ở đây" Có nhiều tiêu chuẩn XML khác. Bạn có thể tự 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ã. Dù sao đi nữa, 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ứ ở đó :) Và đến đây, bài học của chúng ta đã kết thúc. Đã đến lúc trở lại với nhiệm vụ! :) Cho đến lần sau!
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào