杰瑞科技汇

Java DOM如何解析XML字符串?

使用Java DOM处理XML字符串

在Java中,可以使用DOM(Document Object Model)API来解析、操作和生成XML字符串,以下是完整的示例代码,展示如何从字符串创建XML文档、修改内容以及将文档转换回字符串。

将XML字符串解析为DOM文档

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
public class XmlDomExample {
    public static void main(String[] args) {
        String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            // 创建DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 创建DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 将字符串转换为输入流
            ByteArrayInputStream inputStream = new ByteArrayInputStream(xmlString.getBytes());
            // 解析XML字符串为DOM文档
            Document document = builder.parse(inputStream);
            // 处理文档...
            processDocument(document);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void processDocument(Document document) {
        // 获取根元素
        Element root = document.getDocumentElement();
        System.out.println("Root element: " + root.getNodeName());
        // 获取所有person元素
        NodeList personList = root.getElementsByTagName("person");
        for (int i = 0; i < personList.getLength(); i++) {
            Node personNode = personList.item(i);
            if (personNode.getNodeType() == Node.ELEMENT_NODE) {
                Element personElement = (Element) personNode;
                // 获取属性
                String id = personElement.getAttribute("id");
                System.out.println("Person ID: " + id);
                // 获取子元素
                NodeList nameList = personElement.getElementsByTagName("name");
                if (nameList.getLength() > 0) {
                    Element nameElement = (Element) nameList.item(0);
                    System.out.println("Name: " + nameElement.getTextContent());
                }
                NodeList ageList = personElement.getElementsByTagName("age");
                if (ageList.getLength() > 0) {
                    Element ageElement = (Element) ageList.item(0);
                    System.out.println("Age: " + ageElement.getTextContent());
                }
            }
        }
    }
}

创建新的XML文档并转换为字符串

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.StringWriter;
public class CreateXmlDomExample {
    public static void main(String[] args) {
        try {
            // 创建DocumentBuilderFactory
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 创建DocumentBuilder
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 创建新文档
            Document document = builder.newDocument();
            // 创建根元素
            Element rootElement = document.createElement("root");
            document.appendChild(rootElement);
            // 创建person元素
            Element personElement = document.createElement("person");
            personElement.setAttribute("id", "1");
            rootElement.appendChild(personElement);
            // 创建name元素
            Element nameElement = document.createElement("name");
            nameElement.setTextContent("Alice");
            personElement.appendChild(nameElement);
            // 创建age元素
            Element ageElement = document.createElement("age");
            ageElement.setTextContent("25");
            personElement.appendChild(ageElement);
            // 将DOM文档转换为字符串
            String xmlString = documentToString(document);
            System.out.println("Generated XML:\n" + xmlString);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static String documentToString(Document document) throws Exception {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        // 设置输出属性(可选)
        transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(document), new StreamResult(writer));
        return writer.toString();
    }
}

修改现有XML文档并转换为字符串

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
public class ModifyXmlDomExample {
    public static void main(String[] args) {
        String xmlString = "<root><person id=\"1\"><name>John</name><age>30</age></person></root>";
        try {
            // 解析XML字符串
            Document document = parseXmlString(xmlString);
            // 修改文档
            modifyDocument(document);
            // 转换回字符串
            String modifiedXml = documentToString(document);
            System.out.println("Modified XML:\n" + modifiedXml);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static Document parseXmlString(String xml) throws Exception {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(xml.getBytes());
        return builder.parse(inputStream);
    }
    private static void modifyDocument(Document document) {
        // 修改年龄
        NodeList ageList = document.getElementsByTagName("age");
        if (ageList.getLength() > 0) {
            Element ageElement = (Element) ageList.item(0);
            ageElement.setTextContent("31");
        }
        // 添加新元素
        Element root = document.getDocumentElement();
        Element newPerson = document.createElement("person");
        newPerson.setAttribute("id", "2");
        Element newName = document.createElement("name");
        newName.setTextContent("Bob");
        newPerson.appendChild(newName);
        Element newAge = document.createElement("age");
        newAge.setTextContent("28");
        newPerson.appendChild(newAge);
        root.appendChild(newPerson);
    }
    private static String documentToString(Document document) throws Exception {
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(document), new StreamResult(writer));
        return writer.toString();
    }
}

关键点说明

  1. DocumentBuilderFactory:用于创建DocumentBuilder实例
  2. DocumentBuilder:负责解析XML字符串并创建DOM文档
  3. Document:表示整个XML文档的内存表示
  4. Element:表示XML元素
  5. NodeList:表示节点列表(如多个同名元素)
  6. Transformer:用于将DOM文档转换为字符串

注意事项

  • 确保处理XML时正确处理异常
  • 对于大型XML文件,DOM可能消耗较多内存,考虑使用SAX或StAX
  • 在Java 7+中,可以使用try-with-resources来管理资源
  • 如果需要处理命名空间,需要在DocumentBuilderFactory中设置相关属性

示例涵盖了使用Java DOM处理XML字符串的主要操作,包括解析、创建、修改和序列化。

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