【详解】DocumentBuilder解析出指定节点XMLString数据

举报
皮牙子抓饭 发表于 2025/11/24 09:55:55 2025/11/24
【摘要】 DocumentBuilder解析出指定节点XMLString数据在处理XML文档时,经常需要从复杂的XML结构中提取特定的信息。Java的​​javax.xml.parsers.DocumentBuilder​​和​​org.w3c.dom​​包提供了强大的工具来解析和操作XML文档。本文将详细介绍如何使用​​DocumentBuilder​​解析XML,并从中提取指定节点的数据。1. 引...

DocumentBuilder解析出指定节点XMLString数据

在处理XML文档时,经常需要从复杂的XML结构中提取特定的信息。Java的​​javax.xml.parsers.DocumentBuilder​​和​​org.w3c.dom​​包提供了强大的工具来解析和操作XML文档。本文将详细介绍如何使用​​DocumentBuilder​​解析XML,并从中提取指定节点的数据。

1. 引入必要的库

在开始之前,确保你的项目中已经包含了处理XML所需的库。通常情况下,这些库是Java标准库的一部分,因此不需要额外添加依赖。

2. 创建DocumentBuilderFactory和DocumentBuilder

首先,我们需要创建一个​​DocumentBuilderFactory​​实例,然后使用它来创建一个​​DocumentBuilder​​对象。​​DocumentBuilder​​对象可以用来解析XML文件或字符串。

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import java.io.StringReader;

public class XMLParser {
    public static void main(String[] args) {
        try {
            // 创建DocumentBuilderFactory实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 创建DocumentBuilder实例
            DocumentBuilder builder = factory.newDocumentBuilder();

            // 示例XML字符串
            String xmlString = "<root><item id='1'><name>Item 1</name><price>100</price></item><item id='2'><name>Item 2</name><price>200</price></item></root>";

            // 将XML字符串转换为InputStream
            Document document = builder.parse(new InputSource(new StringReader(xmlString)));

            // 解析并处理XML文档
            processDocument(document);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 解析XML文档

使用​​DocumentBuilder​​解析XML文档后,我们可以通过DOM API访问和操作文档中的元素。

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

public static void processDocument(Document document) {
    // 获取所有名为"item"的节点
    NodeList nodeList = document.getElementsByTagName("item");

    for (int i = 0; i < nodeList.getLength(); i++) {
        Node node = nodeList.item(i);

        if (node.getNodeType() == Node.ELEMENT_NODE) {
            Element element = (Element) node;
            // 获取id属性
            String id = element.getAttribute("id");
            // 获取name子节点的文本内容
            String name = element.getElementsByTagName("name").item(0).getTextContent();
            // 获取price子节点的文本内容
            String price = element.getElementsByTagName("price").item(0).getTextContent();

            System.out.println("ID: " + id);
            System.out.println("Name: " + name);
            System.out.println("Price: " + price);
        }
    }
}

4. 提取指定节点的XML字符串

如果需要提取某个节点的完整XML字符串,可以使用​​javax.xml.transform​​包中的类来实现。

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;

public static String getNodeXML(Node node) {
    try {
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(node), new StreamResult(writer));
        return writer.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

5. 完整示例

将上述代码整合在一起,形成一个完整的示例:

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;

public class XMLParser {
    public static void main(String[] args) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            String xmlString = "<root><item id='1'><name>Item 1</name><price>100</price></item><item id='2'><name>Item 2</name><price>200</price></item></root>";
            Document document = builder.parse(new InputSource(new StringReader(xmlString)));

            processDocument(document);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void processDocument(Document document) {
        NodeList nodeList = document.getElementsByTagName("item");

        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);

            if (node.getNodeType() == Node.ELEMENT_NODE) {
                Element element = (Element) node;
                String id = element.getAttribute("id");
                String name = element.getElementsByTagName("name").item(0).getTextContent();
                String price = element.getElementsByTagName("price").item(0).getTextContent();

                System.out.println("ID: " + id);
                System.out.println("Name: " + name);
                System.out.println("Price: " + price);

                // 提取指定节点的XML字符串
                String itemXML = getNodeXML(node);
                System.out.println("Item XML: " + itemXML);
            }
        }
    }

    public static String getNodeXML(Node node) {
        try {
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            StringWriter writer = new StringWriter();
            transformer.transform(new DOMSource(node), new StreamResult(writer));
            return writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}


下面是一个使用Java中的​​DocumentBuilder​​​来解析XML文档并提取指定节点的数据的示例代码。假设我们有一个XML文件 ​​example.xml​​,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <person>
        <name>John Doe</name>
        <age>30</age>
        <city>New York</city>
    </person>
    <person>
        <name>Jane Smith</name>
        <age>25</age>
        <city>Los Angeles</city>
    </person>
</root>


我们的目标是从这个XML文件中提取所有 ​​<person>​​ 节点的 ​​<name>​​ 元素的值。

示例代码

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class XMLParserExample {
    public static void main(String[] args) {
        try {
            // 创建一个DocumentBuilderFactory对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            
            // 创建一个DocumentBuilder对象
            DocumentBuilder builder = factory.newDocumentBuilder();
            
            // 加载并解析XML文件
            File xmlFile = new File("example.xml");
            Document doc = builder.parse(xmlFile);
            
            // 规范化文档结构
            doc.getDocumentElement().normalize();
            
            // 获取所有的 <person> 节点
            NodeList personList = doc.getElementsByTagName("person");
            
            // 遍历每个 <person> 节点
            for (int i = 0; i < personList.getLength(); i++) {
                Node personNode = personList.item(i);
                
                // 确保当前节点是元素节点
                if (personNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element personElement = (Element) personNode;
                    
                    // 获取 <name> 节点
                    NodeList nameList = personElement.getElementsByTagName("name");
                    Element nameElement = (Element) nameList.item(0);
                    
                    // 获取 <name> 节点的文本内容
                    String name = nameElement.getTextContent();
                    
                    // 输出结果
                    System.out.println("Name: " + name);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码解释

  1. 创建 DocumentBuilderFactory​ 和 DocumentBuilder:
  • ​DocumentBuilderFactory​​ 用于创建 ​​DocumentBuilder​​ 对象。
  • ​DocumentBuilder​​ 用于解析XML文档。
  1. 加载和解析XML文件:
  • 使用 ​​DocumentBuilder​​ 的 ​​parse​​ 方法加载并解析XML文件,返回一个 ​​Document​​ 对象。
  1. 规范化文档结构:
  • ​doc.getDocumentElement().normalize()​​ 用于规范化文档结构,确保文档树的一致性。
  1. 获取所有 <person>​ 节点:
  • 使用 ​​getElementsByTagName​​ 方法获取所有 ​​<person>​​ 节点,返回一个 ​​NodeList​​ 对象。
  1. 遍历每个 <person>​ 节点:
  • 使用 ​​for​​ 循环遍历 ​​NodeList​​ 中的每个节点。
  • 检查节点类型是否为元素节点(​​Node.ELEMENT_NODE​​)。
  • 获取 ​​<name>​​ 节点并提取其文本内容。
  1. 输出结果:
  • 打印每个 ​​<person>​​ 节点的 ​​<name>​​ 元素的值。

运行结果

运行上述代码后,输出将会是:

Name: John Doe
Name: Jane Smith

希望这个示例对你有帮助!如果你有任何其他问题或需要进一步的解释,请随时告诉我。在Java中,使用​​DocumentBuilder​​来解析XML文档并提取特定节点的数据是一个常见的任务。下面我将详细介绍如何使用​​DocumentBuilderFactory​​和​​DocumentBuilder​​来解析XML,并从XML字符串中获取指定节点的数据。

1. 导入必要的类

首先,确保你导入了处理XML所需的类:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import java.io.StringReader;

2. 创建​​DocumentBuilder​​实例

使用​​DocumentBuilderFactory​​创建一个​​DocumentBuilder​​实例,这个实例可以用来解析XML文档。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

3. 解析XML字符串

假设你有一个XML字符串,你需要将其转换为​​InputSource​​对象,然后使用​​DocumentBuilder​​解析它。

String xmlString = "<root><person><name>John Doe</name><age>30</age></person></root>";
InputSource is = new InputSource(new StringReader(xmlString));
Document doc = builder.parse(is);

4. 获取指定节点的数据

解析完XML后,你可以使用DOM API来导航和查询文档树。例如,如果你想获取​​<name>​​节点的值,可以这样做:

// 获取根元素
Node root = doc.getDocumentElement();

// 获取所有名为"person"的子节点
NodeList personNodes = root.getElementsByTagName("person");

for (int i = 0; i < personNodes.getLength(); i++) {
    Node personNode = personNodes.item(i);

    // 获取名为"name"的子节点
    NodeList nameNodes = personNode.getChildNodes();
    for (int j = 0; j < nameNodes.getLength(); j++) {
        Node nameNode = nameNodes.item(j);
        if ("name".equals(nameNode.getNodeName())) {
            // 获取节点的文本内容
            String name = nameNode.getTextContent();
            System.out.println("Name: " + name);
        }
    }
}

5. 完整示例

将上述步骤整合成一个完整的示例:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import java.io.StringReader;

public class XMLParserExample {
    public static void main(String[] args) {
        try {
            // 创建DocumentBuilderFactory和DocumentBuilder实例
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();

            // XML字符串
            String xmlString = "<root><person><name>John Doe</name><age>30</age></person></root>";

            // 将XML字符串转换为InputSource
            InputSource is = new InputSource(new StringReader(xmlString));

            // 解析XML
            Document doc = builder.parse(is);

            // 获取根元素
            Node root = doc.getDocumentElement();

            // 获取所有名为"person"的子节点
            NodeList personNodes = root.getElementsByTagName("person");

            for (int i = 0; i < personNodes.getLength(); i++) {
                Node personNode = personNodes.item(i);

                // 获取名为"name"的子节点
                NodeList nameNodes = personNode.getChildNodes();
                for (int j = 0; j < nameNodes.getLength(); j++) {
                    Node nameNode = nameNodes.item(j);
                    if ("name".equals(nameNode.getNodeName())) {
                        // 获取节点的文本内容
                        String name = nameNode.getTextContent();
                        System.out.println("Name: " + name);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

6. 注意事项

  • 异常处理:在实际应用中,建议对​​DocumentBuilderFactory​​和​​DocumentBuilder​​的创建以及解析过程中的异常进行更详细的处理。
  • 性能考虑:对于大型XML文档,DOM解析可能会消耗较多内存。在这种情况下,可以考虑使用SAX或StAX等流式解析器。

通过以上步骤,你可以轻松地使用​​DocumentBuilder​​解析XML字符串并提取指定节点的数据。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。