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

[JAVA100例] 第68例:使用 DOM 解析 XML——樹模型隨機訪問

     編輯:Java 相關知識

本例演示使用標準 JDK DOM API 解析 XML:構建完整文檔樹,通過 getElementsByTagName 獲取節點列表,隨機訪問提取屬性與文本內容。

核心代碼

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;

public class DOMPageList {
  public static void main(String[] args) {
    try {
      DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder = dbfactory.newDocumentBuilder();
      Document doc = builder.parse(new File("book.xml"));  // 解析生成 Document 樹

      Element root = doc.getDocumentElement();
      System.out.println("根節點標記名:" + root.getTagName());
      System.out.println("*****下面遍歷XML元素*****");

      NodeList list = root.getElementsByTagName("page");  // 獲取所有 page 元素(含後代)
      for (int i = 0; i < list.getLength(); i++) {
        Element element = (Element) list.item(i);
        String id = element.getAttribute("id");  // 獲取屬性

        NodeList titleList = element.getElementsByTagName("title");
        Element titleElement = (Element) titleList.item(0);
        String title = titleElement.getFirstChild().getNodeValue();  // 獲取文本節點值

        NodeList fileList = element.getElementsByTagName("file");
        Element fileElement = (Element) fileList.item(0);
        String file = fileElement.getFirstChild().getNodeValue();

        System.out.println("ID" + id + " " + "title" + title + "file" + file);
      }
    } catch (Exception e) { e.printStackTrace(); }
  }
}

待解析 XML (book.xml)

<book>
  <page id="1">
    <title>第一章 入門</title>
    <file>chapter1.html</file>
  </page>
  <page id="2">
    <title>第二章 進階</title>
    <file>chapter2.html</file>
  </page>
</book>

關鍵 DOM API 解析

類/方法說明
DocumentBuilderFactory工廠模式獲取解析器實例
DocumentBuilder解析器,parse() 生成 Document
Document文檔樹根,getDocumentElement() 獲取根元素
Element元素節點,getAttribute() 獲取屬性
getElementsByTagName()遞歸查找所有匹配名稱的後代元素,返回 NodeList
NodeList節點列表,getLength()/item(index) 遍歷
getFirstChild().getNodeValue()獲取元素首個文本子節點的值(標準 DOM 文本提取方式)

DOM 核心特點

  • 樹模型:整個文檔加載為內存樹結構,支持隨機訪問、修改、刪除節點
  • 雙向導航:父子兄弟節點可相互導航(getParentNode()、getNextSibling() 等)
  • 可寫入:支持創建新節點、修改屬性/文本、序列化回 XML
  • 內存壓力:文檔大小受限於堆內存,超大文件易 OOM

常見坑點與最佳實踐

  1. 文本節點分割:連續文本可能被拆分為多個 Text 節點,建議使用 getTextContent() (DOM Level 3) 直接獲取完整文本
  2. 空白文本節點:格式化 XML 中的縮進換行會生成空白 Text 節點,遍歷時需過濾 node.getNodeType() == Node.TEXT_NODE && node.getTextContent().trim().length() > 0
  3. 命名空間:涉及命名空間時使用 getElementsByTagNameNS() 和 getAttributeNS()
  4. 線程安全:DocumentBuilder 非線程安全,每線程創建或同步使用

現代增強:JDK 內置 XPath 支持

import javax.xml.xpath.*;
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
String title = xpath.evaluate("/book/page[@id='1']/title/text()", doc);

XPath 可大幅簡化複雜查詢邏輯,推薦配合 DOM 使用。

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