杰瑞科技汇

Java如何高效解析document?

Java 解析 Document

在 Java 中解析文档(Document)通常指的是解析 XML 或 HTML 文档,以下是几种常见的 Java 解析文档的方法:

Java如何高效解析document?-图1
(图片来源网络,侵删)

使用 DOM 解析器

DOM (Document Object Model) 将整个文档加载到内存中,形成一个树形结构。

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class DomParserExample {
    public static void main(String[] args) {
        try {
            // 创建 DocumentBuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 解析 XML 文件
            Document document = builder.parse(new File("example.xml"));
            // 获取根元素
            Element root = document.getDocumentElement();
            System.out.println("Root element: " + root.getNodeName());
            // 获取所有子节点
            NodeList nodeList = root.getChildNodes();
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    System.out.println("Element: " + element.getNodeName());
                    System.out.println("Value: " + element.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 SAX 解析器

SAX (Simple API for XML) 是事件驱动的解析器,适合处理大文件。

import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.*;
public class SaxParserExample {
    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();
            // 创建自定义的 Handler
            DefaultHandler handler = new DefaultHandler() {
                boolean inElement = false;
                @Override
                public void startElement(String uri, String localName, 
                        String qName, Attributes attributes) {
                    System.out.println("Start element: " + qName);
                    inElement = true;
                }
                @Override
                public void characters(char[] ch, int start, int length) {
                    if (inElement) {
                        System.out.println("Value: " + new String(ch, start, length));
                    }
                }
                @Override
                public void endElement(String uri, String localName, String qName) {
                    System.out.println("End element: " + qName);
                    inElement = false;
                }
            };
            saxParser.parse("example.xml", handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 JAXP (Java API for XML Processing)

JAXP 是 Java 提供的标准的 XML 处理 API。

import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
public class JaxpExample {
    public static void main(String[] args) {
        try {
            // 创建 Document
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();
            // 创建根元素
            Element root = document.createElement("root");
            document.appendChild(root);
            // 添加子元素
            Element child = document.createElement("child");
            child.setTextContent("Hello, World!");
            root.appendChild(child);
            // 输出到文件
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new File("output.xml"));
            transformer.transform(source, result);
            System.out.println("XML file created successfully!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 Jsoup 解析 HTML

Jsoup 是一个专门用于解析 HTML 的 Java 库。

Java如何高效解析document?-图2
(图片来源网络,侵删)
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
    public static void main(String[] args) {
        try {
            // 从 URL 解析
            Document doc = Jsoup.connect("http://example.com").get();
            System.out.println("Title: " + doc.title());
            // 从字符串解析
            String html = "<html><head><title>Test</title></head><body><p>Hello</p></body></html>";
            Document docFromString = Jsoup.parse(html);
            System.out.println("Title: " + docFromString.title());
            // 选择元素
            Elements paragraphs = doc.select("p");
            for (Element p : paragraphs) {
                System.out.println("Paragraph: " + p.text());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 StAX 解析器

StAX (Streaming API for XML) 是另一种流式 XML 解析 API。

import javax.xml.stream.*;
import javax.xml.stream.events.*;
import java.io.*;
public class StaxParserExample {
    public static void main(String[] args) {
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader eventReader = factory.createXMLEventReader(new FileReader("example.xml"));
            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();
                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                    System.out.println("Start element: " + startElement.getName());
                }
                if (event.isCharacters()) {
                    Characters characters = event.asCharacters();
                    System.out.println("Value: " + characters.getData());
                }
                if (event.isEndElement()) {
                    EndElement endElement = event.asEndElement();
                    System.out.println("End element: " + endElement.getName());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

选择合适的解析器

  • DOM: 适合小型文档,需要频繁访问文档结构
  • SAX: 适合大型文档,内存占用小
  • StAX: 介于 DOM 和 SAX 之间,提供更好的控制
  • Jsoup: 专门用于 HTML 解析,功能强大

根据你的具体需求选择合适的解析方法。

Java如何高效解析document?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇