Bài viết này hướng dẫn cách sử dụng Java DOM Parser + XSLT để định dạng hoặc in ấn một tài liệu XML.
Một File XML
<?xml version="1.0" encoding="utf-8"?>
<company>
<staff id="1001">
<name>sharecs</name>
<role>support</role>
</staff>
<staff id="1002">
<name>yflow</name>
<role>admin</role>
</staff>
</company>
Hiển Thị File XML Thông Qua Transformer
Trong javax.xml.transform.Transformer, chúng ta có thể cấu hình thuộc tính OutputKeys.INDENT để in các tài liệu XML.
private static void transform(Document doc, OutputStream output)
throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
// pretty print
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.transform(new DOMSource(doc), new StreamResult(output));
}
Kết quả:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<company>
<staff id="1001">
<name>sharecs</name>
<role>support</role>
</staff>
<staff id="1002">
<name>yflow</name>
<role>admin</role>
</staff>
</company>
Tuy nhiên, Transformer sẽ thêm nhiều dòng mới trống (được thử nghiệm trong Java 11) trong đầu ra, mình không chắc chắn tại sao?
Hiển Thị File XML khá đẹp qua XSLT
Để giải quyết vấn đề dòng mới trống thừa ở trên, chúng ta có thể thêm một xslt tệp để chuyển đổi bản hiển thị đẹp.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" cdata-section-elements="cdata-other-elements"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Ví dụ về trình phân tích cú pháp DOM cho phép chuyển đổi XSLT.
package com.sharecs.xml.dom.xslt;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
public class XsltPrettyPrintDomParser {
private static final String XML_FILENAME
= "src/main/resources/staff-simple.xml";
private static final String XSLT_FILENAME
= "src/main/resources/xslt/staff-format.xslt";
public static void main(String[] args) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try (InputStream is = new FileInputStream(XML_FILENAME)) {
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(is);
transform(doc, System.out);
} catch (IOException | ParserConfigurationException |
SAXException | TransformerException e) {
e.printStackTrace();
}
}
private static void transform(Document doc, OutputStream output)
throws TransformerException {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
//Transformer transformer = transformerFactory.newTransformer();
// add XSLT for pretty print
Transformer transformer = transformerFactory.newTransformer(
new StreamSource(new File(XSLT_FILENAME)));
// pretty print, this will add extra new lines
// transformer.setOutputProperty(OutputKeys.INDENT, "yes");
// add extra standalone to break the root node to a new line
transformer.setOutputProperty(OutputKeys.STANDALONE, "no");
transformer.transform(new DOMSource(doc), new StreamResult(output));
}
}
Kết quả:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<company>
<staff id="1001">
<name>sharecs</name>
<role>support</role>
</staff>
<staff id="1002">
<name>yflow</name>
<role>admin</role>
</staff>
</company>
Cảm ơn các bạn đã ghé thăm. Chúc các bạn thành công!