Cách đọc và ghi tệp XML bằng mã

Cách đọc và ghi tệp XML bằng mã

Bạn có muốn tìm hiểu cách đọc và ghi tệp XML từ java không?





Tệp XML được sử dụng cho nhiều mục đích khác nhau bao gồm cả việc lưu trữ dữ liệu. Trước khi JSON trở nên phổ biến, XML là định dạng ưa thích để biểu diễn, lưu trữ và vận chuyển dữ liệu có cấu trúc. Mặc dù sự phổ biến của XML đã giảm dần trong những năm gần đây, đôi khi bạn vẫn có thể gặp phải nó, vì vậy điều quan trọng là phải học cách làm việc với nó từ mã.





Java Standard Edition (SE) bao gồm API Java để xử lý XML (JAXP) , là một thuật ngữ bao trùm hầu hết các khía cạnh của quá trình xử lý XML. Bao gồm các:





  • KIỂM ĐỊNH: Mô hình Đối tượng Tài liệu bao gồm các lớp để làm việc với các tạo tác XML như phần tử, nút, thuộc tính, v.v. DOM API tải tài liệu XML hoàn chỉnh vào bộ nhớ để xử lý, vì vậy nó không phù hợp lắm để làm việc với các tệp XML lớn.
  • KÈN: API đơn giản cho XML là một thuật toán hướng sự kiện để đọc XML. Ở đây XML được xử lý bằng cách kích hoạt các sự kiện được tìm thấy khi đọc XML. Yêu cầu bộ nhớ để sử dụng phương pháp này là thấp, nhưng làm việc với API phức tạp hơn làm việc với DOM.
  • StAX: API luồng cho XML là một bổ sung gần đây cho các API XML và cung cấp khả năng lọc, xử lý và sửa đổi luồng hiệu suất cao của XML. Mặc dù nó tránh tải toàn bộ tài liệu XML vào bộ nhớ, nhưng nó cung cấp một kiến ​​trúc kiểu kéo chứ không phải là một kiến ​​trúc hướng sự kiện, do đó ứng dụng dễ viết và dễ hiểu hơn là sử dụng SAX API.

Trong bài viết này, chúng tôi sử dụng API DOM để trình bày cách đọc và ghi tệp XML từ java. Chúng tôi sẽ đề cập đến hai API khác trong các bài viết trong tương lai.

Tệp XML mẫu

Với mục đích của bài viết này, chúng tôi trình bày các khái niệm bằng cách sử dụng XML mẫu sau, có thể được tìm thấy ở đây :






Gambardella, Matthew
XML Developer's Guide
Computer
44.95
2000-10-01
An in-depth look at creating applications
with XML.


Ralls, Kim
...

Đọc tệp XML

Hãy để chúng tôi xem xét các bước cơ bản cần thiết để đọc tệp XML bằng DOM API.

Bước đầu tiên là lấy một phiên bản của DocumentBuilder . Trình tạo được sử dụng để phân tích cú pháp các tài liệu XML. Để sử dụng cơ bản, chúng tôi làm như sau:





xbox trực tiếp trò chơi miễn phí tháng 11 năm 2017
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();

Bây giờ chúng ta có thể tải toàn bộ tài liệu vào bộ nhớ bắt đầu từ phần tử gốc XML. Trong ví dụ của chúng tôi, nó là mục lục yếu tố.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

Và đó là nó, folks! API DOM để đọc một XML thực sự đơn giản. Bây giờ bạn có quyền truy cập vào toàn bộ tài liệu XML bắt đầu từ phần tử gốc của nó, mục lục . Bây giờ chúng ta hãy xem cách làm việc với nó.





Sử dụng API DOM

Bây giờ chúng ta đã có gốc XML Yếu tố , chúng tôi có thể sử dụng API DOM để trích xuất các thông tin thú vị.

Nhận tất cả sách con của phần tử gốc và lặp qua chúng. Lưu ý rằng getChildNodes () trả lại tất cả các phần tử con, bao gồm văn bản, nhận xét, v.v. Vì mục đích của chúng tôi, chúng tôi chỉ cần các phần tử con, vì vậy chúng tôi bỏ qua các phần tử khác.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
// work with the book Element here
}

Làm thế nào để bạn tìm thấy một phần tử con cụ thể, được cung cấp cho phần tử gốc? Phương thức tĩnh sau đây trả về phần tử phù hợp đầu tiên nếu được tìm thấy hoặc null. Như bạn có thể thấy, thủ tục liên quan đến việc lấy danh sách các nút con và lặp qua chúng để chọn ra các nút phần tử có tên được chỉ định.

static private Node findFirstNamedElement(Node parent,String tagName)
{
NodeList children = parent.getChildNodes();
for (int i = 0, in = children.getLength() ; i Node child = children.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
if ( child.getNodeName().equals(tagName) )
return child;
}
return null;
}

Lưu ý rằng API DOM xử lý nội dung văn bản trong một phần tử như một nút riêng biệt của loại TEXT_NODE . Ngoài ra, nội dung văn bản có thể được chia thành nhiều nút văn bản liền kề. Vì vậy, xử lý đặc biệt sau đây là cần thiết để tìm nạp nội dung văn bản trong một phần tử.

static private String getCharacterData(Node parent)
{
StringBuilder text = new StringBuilder();
if ( parent == null )
return text.toString();
NodeList children = parent.getChildNodes();
for (int k = 0, kn = children.getLength() ; k Node child = children.item(k);
if ( child.getNodeType() != Node.TEXT_NODE )
break;
text.append(child.getNodeValue());
}
return text.toString();
}

Được trang bị các chức năng tiện lợi này, bây giờ chúng ta hãy xem một số mã để liệt kê một số thông tin từ XML mẫu của chúng ta. Chúng tôi muốn hiển thị thông tin chi tiết cho từng cuốn sách, chẳng hạn như sẽ có trong danh mục sách.

NodeList books = catalog.getChildNodes();
for (int i = 0, ii = 0, n = books.getLength() ; i Node child = books.item(i);
if ( child.getNodeType() != Node.ELEMENT_NODE )
continue;
Element book = (Element)child;
ii++;
String id = book.getAttribute('id');
String author = getCharacterData(findFirstNamedElement(child,'author'));
String title = getCharacterData(findFirstNamedElement(child,'title'));
String genre = getCharacterData(findFirstNamedElement(child,'genre'));
String price = getCharacterData(findFirstNamedElement(child,'price'));
String pubdate = getCharacterData(findFirstNamedElement(child,'pubdate'));
String descr = getCharacterData(findFirstNamedElement(child,'description'));
System.out.printf('%3d. book id = %s
' +
' author: %s
' +
' title: %s
' +
' genre: %s
' +
' price: %s
' +
' pubdate: %s
' +
' descr: %s
',
ii, id, author, title, genre, price, pubdate, descr);
}

Viết đầu ra XML

Java cung cấp API Tranform XML để chuyển đổi dữ liệu XML. Chúng tôi sử dụng API này với biến đổi danh tính để tạo ra đầu ra.

Để làm ví dụ, hãy để chúng tôi thêm một sách phần tử của danh mục mẫu được trình bày ở trên. Các chi tiết của cuốn sách (chẳng hạn như tác giả , chức vụ , v.v.) có thể được lấy từ bên ngoài, có thể từ tệp thuộc tính hoặc cơ sở dữ liệu. Chúng tôi sử dụng tệp thuộc tính sau để tải dữ liệu.

id=bk113
author=Jane Austen
title=Pride and Prejudice
genre=Romance
price=6.99
publish_date=2010-04-01
description='It is a truth universally acknowledged, that a single man in possession of a good fortune must be in want of a wife.' So begins Pride and Prejudice, Jane Austen's witty comedy of manners-one of the most popular novels of all time-that features splendidly civilized sparring between the proud Mr. Darcy and the prejudiced Elizabeth Bennet as they play out their spirited courtship in a series of eighteenth-century drawing-room intrigues.

Bước đầu tiên là phân tích cú pháp tệp XML hiện có bằng phương pháp được trình bày ở trên. Mã cũng được hiển thị bên dưới.

File file = ...; // XML file to read
Document document = builder.parse(file);
Element catalog = document.getDocumentElement();

Chúng tôi tải dữ liệu từ tệp thuộc tính bằng cách sử dụng Tính chất lớp được cung cấp với java. Đoạn mã khá đơn giản và được hiển thị bên dưới.

String propsFile = ...;
Properties props = new Properties();
try (FileReader in = new FileReader(propsFile)) {
props.load(in);
}

Sau khi các thuộc tính được tải, chúng tôi truy xuất các giá trị mà chúng tôi muốn thêm từ tệp thuộc tính.

String id = props.getProperty('id');
String author = props.getProperty('author');
String title = props.getProperty('title');
String genre = props.getProperty('genre');
String price = props.getProperty('price');
String publish_date = props.getProperty('publish_date');
String descr = props.getProperty('description');

Bây giờ hãy để chúng tôi tạo ra một sản phẩm trống sách yếu tố.

cách chụp ảnh màn hình trên surface pro
Element book = document.createElement('book');
book.setAttribute('id', id);

Thêm các phần tử con vào sách là tầm thường. Để thuận tiện, chúng tôi thu thập các tên phần tử được yêu cầu trong Danh sách và thêm các giá trị trong một vòng lặp.

List elnames =Arrays.asList('author', 'title', 'genre', 'price',
'publish_date', 'description');
for (String elname : elnames) {
Element el = document.createElement(elname);
Text text = document.createTextNode(props.getProperty(elname));
el.appendChild(text);
book.appendChild(el);
}
catalog.appendChild(book);

Và đó là cách nó được thực hiện. Các mục lục phần tử bây giờ có phần tử mới sách phần tử được thêm vào. Tất cả những gì còn lại bây giờ là viết ra XML đã cập nhật.

Để viết XML, chúng ta cần một phiên bản của Máy biến áp được tạo như hình dưới đây. Lưu ý rằng chúng tôi yêu cầu thụt lề của XML đầu ra bằng cách sử dụng setOutputProperty () phương pháp.

TransformerFactory tfact = TransformerFactory.newInstance();
Transformer tform = tfact.newTransformer();
tform.setOutputProperty(OutputKeys.INDENT, 'yes');
tform.setOutputProperty('{http://xml.apache.org/xslt}indent-amount', '3');

Bước cuối cùng trong việc tạo đầu ra XML là áp dụng chuyển đổi. Kết quả xuất hiện trên luồng đầu ra, System.out .

tform.transform(new DOMSource(document), new StreamResult(System.out));

Để ghi đầu ra trực tiếp vào một tệp, hãy sử dụng cách sau.

tform.transform(new DOMSource(document), new StreamResult(new File('output.xml')));

Và điều đó kết thúc bài viết này về cách đọc và ghi các tệp XML bằng API DOM.

Bạn đã sử dụng API DOM trong các ứng dụng của mình chưa? Nó đã hoạt động như thế nào? Vui lòng cho chúng tôi biết trong phần bình luận bên dưới.

Đăng lại Đăng lại tiếng riu ríu E-mail Canon so với Nikon: Thương hiệu máy ảnh nào tốt hơn?

Canon và Nikon là hai tên tuổi lớn nhất trong ngành công nghiệp máy ảnh. Nhưng thương hiệu nào cung cấp dòng máy ảnh và ống kính tốt hơn?

Đọc tiếp
Chủ đề liên quan
  • Lập trình
  • Java
Giới thiệu về tác giả Jay Sridhar(17 bài báo đã xuất bản) Xem thêm từ Jay Sridhar

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký