Java中的XML使用 | AI生成和翻译

Home 2025.02

在 Java 中使用 XML 可通过多种方式实现,具体取决于你的需求——解析、创建或操作 XML 数据。以下是一份简明指南,介绍几种常见方法:

1. 使用 DOM(文档对象模型)解析 XML

若需将 XML 作为内存中的树结构进行读取和操作,DOM API 是不错的选择。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XMLParser {
    public static void main(String[] args) {
        try {
            // 加载并解析 XML 文件
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse("example.xml");

            // 标准化 XML 结构
            doc.getDocumentElement().normalize();

            // 访问元素(例如所有 "item" 标签)
            NodeList list = doc.getElementsByTagName("item");
            for (int i = 0; i < list.getLength(); i++) {
                Element element = (Element) list.item(i);
                System.out.println("元素: " + element.getNodeName());
                System.out.println("值: " + element.getTextContent());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

示例 XML (example.xml):

<root>
    <item>项目 1</item>
    <item>项目 2</item>
</root>

2. 使用 SAX(XML 简单 API)解析 XML

对于需要内存效率的大型 XML 文件,SAX 采用事件驱动模式,不会将整个文件加载到内存。

import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SAXExample {
    public static void main(String[] args) {
        try {
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser saxParser = factory.newSAXParser();

            DefaultHandler handler = new DefaultHandler() {
                boolean inItem = false;

                @Override
                public void startElement(String uri, String localName, String qName, Attributes attributes) {
                    if (qName.equalsIgnoreCase("item")) {
                        inItem = true;
                    }
                }

                @Override
                public void characters(char[] ch, int start, int length) {
                    if (inItem) {
                        System.out.println("项目: " + new String(ch, start, length));
                        inItem = false;
                    }
                }
            };

            saxParser.parse("example.xml", handler);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 使用 DOM 创建 XML

从头生成 XML:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

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

            // 根元素
            Element root = doc.createElement("root");
            doc.appendChild(root);

            // 子元素
            Element item = doc.createElement("item");
            item.appendChild(doc.createTextNode("项目 1"));
            root.appendChild(item);

            // 保存到文件
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult result = new StreamResult("output.xml");
            transformer.transform(source, result);

            System.out.println("XML 文件已创建!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这将创建具有前述结构的 output.xml 文件。


4. 使用 JAXB(Java XML 绑定架构)

若需处理与 Java 对象映射的 XML(如序列化/反序列化),JAXB 是更高级的选择。需要使用注解定义类。

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
class Item {
    private String name;

    @XmlElement
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.File;

public class JAXBExample {
    public static void main(String[] args) {
        try {
            // 编组(Java 转 XML)
            JAXBContext context = JAXBContext.newInstance(Item.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            Item item = new Item();
            item.setName("项目 1");
            marshaller.marshal(item, new File("item.xml"));

            // 解组(XML 转 Java)
            Unmarshaller unmarshaller = context.createUnmarshaller();
            Item loadedItem = (Item) unmarshaller.unmarshal(new File("item.xml"));
            System.out.println("已加载项目: " + loadedItem.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

快速开始

选择哪种方法取决于具体需求——DOM 适合灵活性要求高的场景,SAX 适合注重效率的场景,JAXB 适合对象映射场景。需要深入了解其中任何方法吗?


Back Donate