首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java XML 轉文本完整方案:DOM、SAX、StAX 三種解析器對比與代碼示例

     編輯:程式設計疑難解答

需求分析

將 XML 文件解析為純文本輸出,需遞歸遍歷所有節點,提取標籤名、屬性、文本內容。

三種主流解析方式對比

解析器特點適用場景內存佔用
DOM (Document Object Model)一次性載入整棵樹,隨機訪問,易修改小文件、需頻繁增刪改查高(整文檔入內存)
SAX (Simple API for XML)事件驅動流式讀取,只讀,不可回溯大文件、單次順序讀取極低
StAX (Streaming API for XML)拉取式流式讀取,可控制解析進度大文件、需部分跳過/提前終止低

DOM 遞歸遍歷完整代碼(最適合「轉文本」需求)

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

public class XmlToText {
    public static void main(String[] args) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new File("input.xml"));
        doc.getDocumentElement().normalize();

        StringBuilder sb = new StringBuilder();
        printNode(doc.getDocumentElement(), sb, 0);
        System.out.println(sb.toString());
    }

    static void printNode(Node node, StringBuilder sb, int depth) {
        String indent = "  ".repeat(depth);
        switch (node.getNodeType()) {
            case Node.ELEMENT_NODE:
                sb.append(indent).append("<").append(node.getNodeName());
                NamedNodeMap attrs = node.getAttributes();
                for (int i = 0; i < attrs.getLength(); i++) {
                    Node attr = attrs.item(i);
                    sb.append(" ").append(attr.getNodeName()).append("=\"").append(attr.getNodeValue()).append("\"");
                }
                sb.append(">\n");
                NodeList children = node.getChildNodes();
                for (int i = 0; i < children.getLength(); i++) {
                    printNode(children.item(i), sb, depth + 1);
                }
                sb.append(indent).append("</").append(node.getNodeName()).append(">\n");
                break;
            case Node.TEXT_NODE:
                String text = node.getNodeValue().trim();
                if (!text.isEmpty()) sb.append(indent).append(text).append("\n");
                break;
            // 可按需處理 CDATA、註釋等
        }
    }
}

SAX 版本要點(適合超大文件)

// 實現 DefaultHandler,重寫 startElement、characters、endElement
// 在 characters 中累積文本,startElement/endElement 輸出標籤

推薦資源

XML 結構示例

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