1. Home
  2. Java XML Tutorial
  3. Hiển Thị File XML Đẹp Với Java Dom và XSLT
Avatar of Nguyễn Tuấn Nguyễn Tuấn 2 năm trước

Hiển Thị File XML Đẹp Với Java Dom và XSLT

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!

0 lượt xem | 0 bình luận
Nếu chỉ đọc những sách người khác hay đọc . Thì bạn chỉ biết được những điều mọi người thường nghĩ .
Đồng ý Cookie
Trang web này sử dụng Cookie để nâng cao trải nghiệm duyệt web của bạn và cung cấp các đề xuất được cá nhân hóa. Bằng cách chấp nhận để sử dụng trang web của chúng tôi