Trong bài viết này mình sẽ hướng dẫn các bạn sử dụng API DOM tích hợp sẵn của Java để ghi dữ liệu vào tệp XML.
Ghi XML vào một file
Các bước tạo và ghi XML vào file.
- Tạo một Document doc.
- Tạo các phần tử XML, thuộc tính, v.v. và nối vào Document doc.
- Tạo một Transformer để ghi Document doc vào một OutputStream.
package com.sharecs.xml.dom;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.OutputStream;
public class WriteXmlDom1 {
public static void main(String[] args)
throws ParserConfigurationException, TransformerException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root elements
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("company");
doc.appendChild(rootElement);
doc.createElement("staff");
rootElement.appendChild(doc.createElement("staff"));
//...create XML elements, and others...
// write dom document to a file
try (FileOutputStream output =
new FileOutputStream("c:\\test\\staff-dom.xml")) {
writeXml(doc, output);
} catch (IOException e) {
e.printStackTrace();
}
}
// write doc to output stream
private static void writeXml(Document doc,
OutputStream output)
throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(output);
transformer.transform(source, result);
}
}
Output
<?xml version="1.0" encoding="UTF-8" standalone="no"?><company><staff>sharecs</staff></company>
Pretty Print XML ( Hiển thị XML đẹp )
Theo mặc định, Transformer đầu ra XML ở định dạng nhỏ gọn.
<?xml version="1.0" encoding="UTF-8" standalone="no"?><company><staff>sharecs</staff></company>
Chúng ta có thể cài đặt OutputKeys.INDENT để Transformer kích hoạt định dạng hiển thị XML đẹp hơn.
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// pretty print XML
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(output);
transformer.transform(source, result);
Kết quả:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<staff>sharecs</staff>
</company>
Viết các phần tử XML, thuộc tính, nhận xét CDATA, v.v.
Ví dụ dưới đây sử dụng DOM Parser để tạo và ghi XML vào một OutputStream.
package com.sharecs.xml.dom;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class WriteXmlDom3 {
public static void main(String[] args)
throws ParserConfigurationException, TransformerException {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root elements
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("company");
doc.appendChild(rootElement);
// staff 1001
// add xml elements
Element staff = doc.createElement("staff");
// add staff to root
rootElement.appendChild(staff);
// add xml attribute
staff.setAttribute("id", "1001");
// alternative
// Attr attr = doc.createAttribute("id");
// attr.setValue("1001");
// staff.setAttributeNode(attr);
Element name = doc.createElement("name");
// JDK 1.4
//name.appendChild(doc.createTextNode("sharecs"));
// JDK 1.5
name.setTextContent("sharecs");
staff.appendChild(name);
Element role = doc.createElement("role");
role.setTextContent("support");
staff.appendChild(role);
Element salary = doc.createElement("salary");
salary.setAttribute("currency", "USD");
salary.setTextContent("5000");
staff.appendChild(salary);
// add xml comment
Comment comment = doc.createComment(
"for special characters like < &, need CDATA");
staff.appendChild(comment);
Element bio = doc.createElement("bio");
// add xml CDATA
CDATASection cdataSection =
doc.createCDATASection("HTML tag <code>testing</code>");
bio.appendChild(cdataSection);
staff.appendChild(bio);
// staff 1002
Element staff2 = doc.createElement("staff");
// add staff to root
rootElement.appendChild(staff2);
staff2.setAttribute("id", "1002");
Element name2 = doc.createElement("name");
name2.setTextContent("yflow");
staff2.appendChild(name2);
Element role2 = doc.createElement("role");
role2.setTextContent("admin");
staff2.appendChild(role2);
Element salary2 = doc.createElement("salary");
salary2.setAttribute("currency", "EUD");
salary2.setTextContent("8000");
staff2.appendChild(salary2);
Element bio2 = doc.createElement("bio");
// add xml CDATA
bio2.appendChild(doc.createCDATASection("a & b"));
staff2.appendChild(bio2);
// print XML to system console
writeXml(doc, System.out);
}
// write doc to output stream
private static void writeXml(Document doc,
OutputStream output)
throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// pretty print
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(output);
transformer.transform(source, result);
}
}
Kết quả:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<staff id="1001">
<name>sharecs</name>
<role>support</role>
<salary currency="USD">5000</salary>
<!--for special characters like < &, need CDATA-->
<bio>
<![CDATA[HTML tag <code>testing</code>]]>
</bio>
</staff>
<staff id="1002">
<name>yflow</name>
<role>admin</role>
<salary currency="EUD">8000</salary>
<bio>
<![CDATA[a & b]]>
</bio>
</staff>
</company>
Câu hỏi thường gặp về DOM
Làm cách nào để tắt khai báo XML?
Chúng ta có thể cấu hình OutputKeys.OMIT_XML_DECLARATION để loại bỏ khai báo XML.
// hide the xml declaration
// hide <?xml version="1.0" encoding="UTF-8" standalone="no"?>
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
Làm cách nào để thay đổi mã hóa XML?
Chúng ta có thể định cấu hình OutputKeys.ENCODING để thay đổi mã hóa XML.
// set xml encoding
// <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
transformer.setOutputProperty(OutputKeys.ENCODING,"ISO-8859-1");
Làm cách nào để hiển thị XML đẹp?
Chúng ta có thể định cấu hình OutputKeys.INDENT để kích hoạt XML bản hiển thị đẹp.
// pretty print
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
Làm cách nào để ẩn khai báo XML ‘standalone =” no ” ‘?
Chúng ta có thể cấu hình document.setXmlStandalone(true) để ẩn khai báo XML standalone=”no”.
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// pretty print
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// hide the standalone="no"
doc.setXmlStandalone(true);
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(output);
transformer.transform(source, result);
Làm cách nào để thay đổi phiên bản khai báo XML?
Chúng ta có thể cấu hình document.setXmlVersion(“version”) để thay đổi phiên bản khai báo XML.
// set xml version
// <?xml version="1.1" encoding="ISO-8859-1" standalone="no"?>
doc.setXmlVersion("1.1");
Cảm ơn các bạn đã ghé thăm. Chúc các bạn thành công!