【详解】DocumentBuilder解析出指定节点XMLString数据
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();
}
}
}
代码解释
- 创建
DocumentBuilderFactory 和DocumentBuilder:
-
DocumentBuilderFactory 用于创建 DocumentBuilder 对象。 -
DocumentBuilder 用于解析XML文档。
- 加载和解析XML文件:
- 使用
DocumentBuilder 的 parse 方法加载并解析XML文件,返回一个 Document 对象。
- 规范化文档结构:
-
doc.getDocumentElement().normalize() 用于规范化文档结构,确保文档树的一致性。
- 获取所有
<person> 节点:
- 使用
getElementsByTagName 方法获取所有 <person> 节点,返回一个 NodeList 对象。
- 遍历每个
<person> 节点:
- 使用
for 循环遍历 NodeList 中的每个节点。 - 检查节点类型是否为元素节点(
Node.ELEMENT_NODE)。 - 获取
<name> 节点并提取其文本内容。
- 输出结果:
- 打印每个
<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字符串并提取指定节点的数据。
- 点赞
- 收藏
- 关注作者
5. 完整示例
5. 完整示例
评论(0)