杰瑞科技汇

Java如何用DOM解析XML字符串?

使用DOM解析XML字符串的Java实现

DOM(Document Object Model)是一种将XML文档加载到内存中并解析为树形结构的方法,下面我将介绍如何使用Java的DOM API来解析XML字符串。

Java如何用DOM解析XML字符串?-图1
(图片来源网络,侵删)

基本步骤

  1. 创建DocumentBuilderFactory
  2. 创建DocumentBuilder
  3. 解析XML字符串
  4. 遍历DOM树
  5. 处理数据

完整代码示例

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.ByteArrayInputStream;
public class DomXmlParser {
    public static void main(String[] args) {
        // 示例XML字符串
        String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "<bookstore>"
                + "  <book category=\"children\">"
                + "    <title lang=\"en\">Harry Potter</title>"
                + "    <author>J.K. Rowling</author>"
                + "    <year>2005</year>"
                + "    <price>29.99</price>"
                + "  </book>"
                + "  <book category=\"web\">"
                + "    <title lang=\"en\">Learning XML</title>"
                + "    <author>Erik T. Ray</author>"
                + "    <year>2003</year>"
                + "    <price>39.95</price>"
                + "  </book>"
                + "</bookstore>";
        try {
            // 1. 创建DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 2. 创建DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 3. 解析XML字符串
            Document document = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
            // 4. 遍历DOM树
            NodeList bookList = document.getElementsByTagName("book");
            for (int i = 0; i < bookList.getLength(); i++) {
                Node bookNode = bookList.item(i);
                if (bookNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element bookElement = (Element) bookNode;
                    // 获取category属性
                    String category = bookElement.getAttribute("category");
                    System.out.println("Book category: " + category);
                    // 获取子元素
                    NodeList childNodes = bookElement.getChildNodes();
                    for (int j = 0; j < childNodes.getLength(); j++) {
                        Node childNode = childNodes.item(j);
                        if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                            Element childElement = (Element) childNode;
                            System.out.println("  " + childElement.getTagName() + ": " + 
                                    childElement.getTextContent());
                        }
                    }
                    System.out.println("----------------------");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代码说明

  1. 创建DocumentBuilderFactory:这是创建DOM解析器的工厂类。

  2. 创建DocumentBuilder:实际执行解析工作的类。

  3. 解析XML字符串

    • 将XML字符串转换为ByteArrayInputStream
    • 使用parse()方法解析输入流
  4. 遍历DOM树

    • getElementsByTagName()获取指定标签名的节点列表
    • 检查节点类型(ELEMENT_NODE
    • 获取元素属性(getAttribute()
    • 获取子节点文本内容(getTextContent()

高级用法

获取特定元素

// 获取第一个book元素
Element firstBook = (Element) document.getElementsByTagName("book").item(0);
元素
Element titleElement = (Element) firstBook.getElementsByTagName("title").item(0);
String title = titleElement.getTextContent();

处理命名空间

// 启用命名空间支持
factory.setNamespaceAware(true);
// 使用命名空间查找元素
NodeList nodes = document.getElementsByTagNameNS("http://example.com/books", "title");

创建新元素并添加到文档

// 创建新元素
Element newBook = document.createElement("book");
newBook.setAttribute("category", "fiction");
// 创建子元素
Element newTitle = document.createElement("title");setTextContent("New Book Title");
// 添加子元素
newBook.appendChild(newTitle);
// 添加到文档
document.getDocumentElement().appendChild(newBook);

注意事项

  1. DOM解析会将整个XML文档加载到内存中,对于大文件可能消耗较多内存
  2. 对于大型XML文件,考虑使用SAX或StAX解析器
  3. 确保正确处理异常情况
  4. 注意XML编码问题,特别是处理包含非ASCII字符的XML时

代码展示了使用Java DOM API解析XML字符串的基本方法,你可以根据实际需求进行调整和扩展。

分享:
扫描分享到社交APP
上一篇
下一篇