JAVA中的XML
发布人:shili8
发布时间:2025-02-04 08:43
阅读次数:0
**Java 中的 XML**
XML(Extensible Markup Language)是一种用于数据交换和存储的标记语言。它允许用户定义自己的标签和结构,来描述和表示数据。Java 提供了多种 API 和工具来处理 XML 数据。
### **DOM 模式**
DOM(Document Object Model)是 Java 中最常用的 XML 处理模式。它将 XML 文档作为一个树状结构来表示,每个节点都有自己的属性和子节点。
**示例代码:**
javaimport javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; public class DOMExample { public static void main(String[] args) throws Exception { // 创建 DocumentBuilderFactory 实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 创建 DocumentBuilder 实例 DocumentBuilder builder = factory.newDocumentBuilder(); // 解析 XML 文件 Document document = builder.parse("example.xml"); // 获取根节点 NodeList nodeList = document.getElementsByTagName("book"); // 遍历节点 for (int i =0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); // 获取属性值 String title = node.getAttributes().getNamedItem("title").getNodeValue(); String author = node.getAttributes().getNamedItem("author").getNodeValue(); System.out.println("Title: " + title); System.out.println("Author: " + author); } } }
**注释:**
* `DocumentBuilderFactory` 和 `DocumentBuilder` 是用于创建和解析 XML 文档的工厂类。
* `getElementsByTagName()` 方法用于获取指定名称的节点列表。
* `getAttributes()` 方法用于获取节点的属性集合。
* `getNodeValue()` 方法用于获取属性值。
### **SAX 模式**
SAX(Simple API for XML)是 Java 中另一种用于处理 XML 的模式。它提供了一个事件驱动的接口,允许用户在解析过程中处理 XML 数据。
**示例代码:**
javaimport org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class SAXExample extends DefaultHandler { public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("Start element: " + qName); // 获取属性值 String title = attributes.getValue("title"); String author = attributes.getValue("author"); System.out.println("Title: " + title); System.out.println("Author: " + author); } public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("End element: " + qName); } public static void main(String[] args) throws Exception { // 创建 XMLReader 实例 org.xml.sax.XMLReader reader = org.xml.sax.helpers.XMLReaderFactory .createXMLReader(); // 设置处理器 reader.setContentHandler(new SAXExample()); // 解析 XML 文件 reader.parse("example.xml"); } }
**注释:**
* `DefaultHandler` 是用于实现事件驱动接口的基类。
* `startElement()` 和 `endElement()` 方法分别用于处理开始和结束元素事件。
* `Attributes` 类用于获取属性值。
### **StAX 模式**
StAX(Streaming API for XML)是 Java 中用于处理 XML 的模式。它提供了一个流式接口,允许用户在解析过程中处理 XML 数据。
**示例代码:**
javaimport javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; public class StAXExample { public static void main(String[] args) throws Exception { // 创建 XMLInputFactory 实例 XMLInputFactory factory = XMLInputFactory.newInstance(); // 创建 XMLEventReader 实例 XMLEventReader reader = factory.createXMLEventReader("example.xml"); // 遍历事件 while (reader.hasNext()) { XMLEvent event = reader.nextEvent(); if (event.isStartElement()) { StartElement startElement = event.asStartElement(); // 获取属性值 String title = startElement.getAttributeValue(null, "title"); String author = startElement.getAttributeValue(null, "author"); System.out.println("Title: " + title); System.out.println("Author: " + author); } else if (event.isEndElement()) { EndElement endElement = event.asEndElement(); System.out.println("End element: " + endElement.getName()); } } } }
**注释:**
* `XMLInputFactory` 是用于创建 XMLEventReader 实例的工厂类。
* `XMLEventReader` 是用于解析 XML 文件的接口。
* `XMLEvent` 是用于表示事件的类。
* `StartElement` 和 `EndElement` 是用于表示开始和结束元素事件的类。
### **JAXB 模式**
JAXB(Java Architecture for XML Binding)是 Java 中用于处理 XML 的模式。它提供了一个绑定接口,允许用户将 Java 类转换为 XML 文件。
**示例代码:**
javaimport javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; public class JAXBExample { public static void main(String[] args) throws Exception { // 创建 JAXBContext 实例 JAXBContext context = JAXBContext.newInstance(Book.class); // 创建 Marshaller 实例 Marshaller marshaller = context.createMarshaller(); // 将 Java 对象转换为 XML 文件 Book book = new Book("Java", "Oracle"); marshaller.marshal(book, "example.xml"); } } class Book { private String title; private String author; public Book(String title, String author) { this.title = title; this.author = author; } @XmlElement public String getTitle() { return title; } @XmlElement public String getAuthor() { return author; } }
**注释:**
* `JAXBContext` 是用于创建 Marshaller 实例的工厂类。
* `Marshaller` 是用于将 Java 对象转换为 XML 文件的接口。
* `Book` 类是用于表示书籍信息的 Java 类。
* `@XmlElement` 注解是用于标记属性值的注解。
### **XMLEncoder**
XMLEncoder 是 Java 中用于序列化 Java 对象到 XML 文件的类。它提供了一个简单的接口,允许用户将 Java 对象转换为 XML 文件。
**示例代码:**
javaimport java.io.OutputStream; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.TransformerFactory; public class XMLEncoderExample { public static void main(String[] args) throws Exception { // 创建 DocumentBuilderFactory 实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 创建 TransformerFactory 实例 TransformerFactory transformerFactory = TransformerFactory.newInstance(); // 将 Java 对象转换为 XML 文件 Book book = new Book("Java", "Oracle"); XMLEncoder encoder = new XMLEncoder(factory.newDocumentBuilder().newDocument()); encoder.writeObject(book); OutputStream outputStream = System.out; encoder.flush(outputStream); } } class Book { private String title; private String author; public Book(String title, String author) { this.title = title; this.author = author; } public String getTitle() { return title; } public String getAuthor() { return author; } }
**注释:**
* `XMLEncoder` 是用于序列化 Java 对象到 XML 文件的类。
* `DocumentBuilderFactory` 和 `TransformerFactory` 是用于创建 DocumentBuilder 实例和 Transformer 实例的工厂类。
* `Book` 类是用于表示书籍信息的 Java 类。
### **XMLDecoder**
XMLDecoder 是 Java 中用于反序列化 XML 文件到 Java 对象的类。它提供了一个简单的接口,允许用户将 XML 文件转换为 Java 对象。
**示例代码:**
javaimport java.io.InputStream; import javax.xml.parsers.DocumentBuilderFactory; public class XMLDecoderExample { public static void main(String[] args) throws Exception { // 创建 DocumentBuilderFactory 实例 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 将 XML 文件转换为 Java 对象 XMLEncoder encoder = new XMLEncoder(factory.newDocumentBuilder().newDocument()); InputStream inputStream = System.in; Book book = (Book) encoder.readObject(inputStream); } } class Book { private String title; private String author; public Book(String title, String author) { this.title = title; this.author = author; } public String getTitle() { return title; } public String getAuthor() { return author; } }
**注释:**
* `XMLDecoder` 是