利用 JDK 自帶的 Document + XPath 解析 XML

利用 JDK 自帶的 Document + XPath 解析 XML,記錄一下

準備工作

inventory.dtd 和 inventory.xml 文件
dtd 中的 PCDATA 的意思是被解析的字符數據(parsed character data)。可把字符數據想象爲 XML 元素的開始標籤與結束標籤之間的文本。PCDATA 是會被解析器解析的文本。
CDATA 的意思是字符數據(character data)。CDATA 是不會被解析器解析的文本。

  • inventory.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT inventory (book+)>
<!ELEMENT book (title,author,dynasty,price)>
<!ATTLIST book year CDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT dynasty (#PCDATA)>
<!ELEMENT price (#PCDATA)>
  • inventory.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE inventory SYSTEM "D:\\work-space\\springboot\\src\\main\\resources\\inventory.dtd">
<inventory>
    <book year="2012">
        <title>菜根譚</title>
        <author>洪應明</author>
        <dynasty>明朝</dynasty>
        <price>38</price>
    </book>
    <book year="2013">
        <title>曾國藩家書</title>
        <author>曾國藩</author>
        <dynasty>清朝</dynasty>
        <price>70</price>
    </book>
    <book year="2014">
        <title>高等代數</title>
        <author>丘維聲</author>
        <dynasty>中華人民共和國</dynasty>
        <price>86</price>
    </book>
</inventory>
  • 工具類

借鑑了博客【用DOM解析XML ,用xpath快速查詢XML節點】的內容

package com.me.util;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import java.io.File;

/**
 * @Author yanyg
 * @Date 2020/6/10 16:37
 * @Descripetion admin
 */
public class ParseXmlUtil {
    //查詢價格大於80的書的標題的內容
    private static final String XPath_EXPRESSION = "//book[price>80]/title/text()";

    public static void main(String[] args) {

        try {
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            //開啓驗證:
            documentBuilderFactory.setValidating(true);
            documentBuilderFactory.setNamespaceAware(false);
            documentBuilderFactory.setIgnoringComments(true);
            documentBuilderFactory.setIgnoringElementContentWhitespace(true);
            documentBuilderFactory.setCoalescing(false);
            documentBuilderFactory.setExpandEntityReferences(true);
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            //設置異常處理:
            documentBuilder.setErrorHandler(new ErrorHandler() {
                @Override
                public void warning(SAXParseException exception) throws SAXException {
                    System.out.println("warn:" + exception.getMessage());
                }

                @Override
                public void error(SAXParseException exception) throws SAXException {
                    System.out.println("error:" + exception.getMessage());
                }

                @Override
                public void fatalError(SAXParseException exception) throws SAXException {
                    System.out.println("fatalError:" + exception.getMessage());
                }
            });
            //將inventory.xml加載到一個Document的對象中:
            String filePath = "D:\\work-space\\springboot\\src\\main\\resources\\inventory.xml";
            Document document = documentBuilder.parse(new File(filePath));
            //根據表達式查詢內容
            processParseXmlWithXpath(document, XPath_EXPRESSION);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }


    private static void processParseXmlWithXpath(Document document, String xPathExpression) throws Exception {
        // 表達式可以參考:https://blog.csdn.net/zlj_blog/article/details/54092534
        xPathExpression = "/inventory/book/title";
        //創建XPathFactory:
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        NodeList nodeList = (NodeList) xPath.evaluate(xPathExpression, document, XPathConstants.NODESET);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node item = nodeList.item(i);
            System.out.println(item.getNodeName() + "=" + item.getTextContent());
        }
    }

    private static void processParseXmlWithXpathExpress(Document document, String xPathExpression) throws Exception {
        //創建XPathFactory:
        XPathFactory xPathFactory = XPathFactory.newInstance();
        XPath xPath = xPathFactory.newXPath();
        XPathExpression expression = xPath.compile(xPathExpression);
        Object result = expression.evaluate(document, XPathConstants.NODESET);
        if (result instanceof NodeList) {
            NodeList nodes = (NodeList) result;
            for (int i = 0; i < nodes.getLength(); i++) {
                System.out.println(String.format("%s=%s", nodes.item(i).getNodeName(), nodes.item(i).getNodeValue()));
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章