首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java DOM 解析 XML 完整範例:從 DocumentBuilderFactory 到節點遍歷

     編輯:Java 程式設計入門

DOM 解析流程圖解

  1. DocumentBuilderFactory.newInstance() → 取得工廠
  2. factory.newDocumentBuilder() → 取得解析器
  3. builder.parse(InputStream) → 解析 XML 產生 Document
  4. doc.getDocumentElement() → 取得根元素
  5. element.getChildNodes() → 取得子節點列表
  6. 遞迴遍歷:判斷 Node.ELEMENT_NODE、讀取屬性、文字內容

完整可執行範例

package com.st.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XmlReader {

    public static void main(String[] args) {
        new XmlReader().parse("D:/test1.xml");
    }

    public void parse(String xmlPath) {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 建議開啟命名空間感知,避免同名標籤衝突
        factory.setNamespaceAware(true);

        try {
            DocumentBuilder builder = factory.newDocumentBuilder();
            InputStream is = new FileInputStream(new File(xmlPath));
            Document doc = builder.parse(is);
            Element root = doc.getDocumentElement();
            NodeList books = root.getChildNodes();

            if (books != null) {
                for (int i = 0; i < books.getLength(); i++) {
                    Node book = books.item(i);
                    if (book.getNodeType() == Node.ELEMENT_NODE) {
                        // 7. 讀取屬性
                        String email = ((Element) book).getAttribute("email");
                        System.out.println("Email: " + email);

                        // 8. 遍歷子元素
                        NodeList children = book.getChildNodes();
                        for (int j = 0; j < children.getLength(); j++) {
                            Node child = children.item(j);
                            if (child.getNodeType() == Node.ELEMENT_NODE) {
                                String tagName = child.getNodeName();
                                // 文字內容在第一個 TEXT_NODE 子節點
                                String text = child.getTextContent().trim();
                                if ("name".equals(tagName)) {
                                    System.out.println("  Name: " + text);
                                } else if ("price".equals(tagName)) {
                                    System.out.println("  Price: " + text);
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

關鍵 API 對照表

需求方法備註
取得屬性值element.getAttribute("name")屬性非子節點,直接用 Element 介面
取得文字內容node.getTextContent()遞迴取得所有子文字,含換行;若只要直接文字用 node.getFirstChild().getNodeValue()
判斷節點型別node.getNodeType() == Node.ELEMENT_NODE常見型別:ELEMENT_NODE(1), ATTRIBUTE_NODE(2), TEXT_NODE(3)
取得子元素(僅元素)element.getElementsByTagName("name")遞迴搜尋;若只要直接子元素需自行過濾

常見坑與最佳實務

  1. 空白文字節點:XML 縮排會產生 TEXT_NODE(含換行空白),遍歷時必須檢查 node.getNodeType()。
  2. 命名空間:若 XML 帶 xmlns,需 factory.setNamespaceAware(true) 並使用 getAttributeNS() 或 XPath。
  3. 大檔案記憶體:DOM 會將整份 XML 載入記憶體,超過 50MB 建議改用 SAX 或 StAX 流式解析。
  4. 編碼:parse(InputStream) 會自動偵測 XML 宣告的 encoding;若無宣告預設 UTF-8。

進階:XPath 簡化查詢

若只需抽取特定資料,XPath 更簡潔:

XPath xpath = XPathFactory.newInstance().newXPath();
NodeList prices = (NodeList) xpath.evaluate("//book/price", doc, XPathConstants.NODESET);
for (int i = 0; i < prices.getLength(); i++) {
    System.out.println(prices.item(i).getTextContent());
}

XPath 適用「查詢導向」場景;DOM 適用「全樹操作/修改」場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved