JAVA日常开发中读写XML的方法详解
作者:xcLeigh
前言
在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特定的轨迹与节奏,组合、交织、碰撞,即将开启一场奇妙且充满无限可能的创造之旅。当空白的文档界面如同深邃的宇宙等待探索,程序员们则化身无畏的星辰开拓者,指尖在键盘上轻舞,准备用智慧与逻辑编织出足以改变世界运行规则的程序画卷,在 0 和 1 的二进制世界里,镌刻下属于人类创新与突破的不朽印记。
一、XML 简介
XML(eXtensible Markup Language)是一种可扩展标记语言,它被设计用来传输和存储数据。XML 的结构类似于 HTML,都是由标签组成,但 XML 的标签是可以自定义的,这使得它具有很强的灵活性。
- 例如,一个简单的 XML 文件可以用来存储书籍信息:
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> </bookstore>
在这个例子中,<?xml version="1.0" encoding="UTF-8"?>是 XML 的声明,它定义了 XML 的版本和编码方式。是根元素,是子元素,并且元素有一个属性category。
二、在 Java 中读取 XML
2.1 使用 DOM(Document Object Model)方式读取 XML
DOM 方式会将整个 XML 文档加载到内存中,形成一个树形结构,然后可以通过遍历这个树形结构来获取 XML 中的数据。
首先,需要导入相关的 Java XML 库。在 Java 中,主要是org.w3c.dom和javax.xml.parsers包。
- 以下是一个简单的读取 XML 文件并获取其中书籍标题的示例代码:
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.File; public class ReadXMLWithDOM { public static void main(String[] args) { try { File xmlFile = new File("books.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(xmlFile); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("book"); for (int i = 0; i < nList.getLength(); i++) { Node nNode = nList.item(i); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; System.out.println("Book title: " + eElement.getElementsByTagName("title").item(0).getTextContent()); } } } catch (Exception e) { e.printStackTrace(); } } }
上述代码首先创建一个DocumentBuilderFactory对象,然后使用它创建一个DocumentBuilder。通过DocumentBuilder的parse方法将 XML 文件解析为一个Document对象。Document对象代表了整个 XML 文档的树形结构。通过getElementsByTagName方法可以获取具有指定标签名的节点列表,然后遍历这个列表来获取每个元素中的
2.2 使用 SAX(Simple API for XML)方式读取 XML
SAX 是一种基于事件驱动的 XML 解析方式。它不会将整个 XML 文档加载到内存中,而是在解析 XML 文档的过程中,当遇到特定的 XML 结构(如开始标签、结束标签、文本内容等)时,会触发相应的事件,通过定义事件处理器来处理这些事件,从而获取 XML 中的数据。
要使用 SAX,需要实现org.xml.sax.ContentHandler接口来定义事件处理器。以下是一个简单的示例,用于统计 XML 文件中书籍的数量:
import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.File; public class ReadXMLWithSAX { public static void main(String[] args) { try { File xmlFile = new File("books.xml"); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); MyHandler handler = new MyHandler(); saxParser.parse(xmlFile, handler); System.out.println("Number of books: " + handler.getBookCount()); } catch (Exception e) { e.printStackTrace(); } } } class MyHandler extends DefaultHandler { private int bookCount = 0; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("book")) { bookCount++; } } public int getBookCount() { return bookCount; } }
在这个示例中,MyHandler类继承自DefaultHandler,并重写了startElement方法。当 SAX 解析器遇到开始标签时,会调用startElement方法。如果遇到标签,就会将bookCount加 1。最后,通过getBookCount方法获取书籍的数量。
三、在 Java 中写入 XML
3.1 使用 DOM 方式写入 XML
- 以下是一个简单的示例,用于创建一个新的 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; public class WriteXMLWithDOM { public static void main(String[] args) { try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.newDocument(); Element bookstore = doc.createElement("bookstore"); doc.appendChild(bookstore); Element book = doc.createElement("book"); bookstore.appendChild(book); Element title = doc.createElement("title"); title.setTextContent("New Book"); book.appendChild(title); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(new File("new_books.xml")); transformer.transform(source, result); } catch (Exception e) { e.printStackTrace(); } } }
首先,通过DocumentBuilder创建一个新的Document对象。然后,使用createElement方法创建 XML 元素,并使用appendChild方法将元素添加到文档树中。设置好元素的文本内容后,通过Transformer将Document对象转换为 XML 文件并保存到磁盘上。
使用 JAXB(Java Architecture for XML Binding)方式写入 XML
JAXB 提供了一种将 Java 对象与 XML 数据进行相互转换的机制。首先需要定义 Java 类来对应 XML 的结构。
- 假设我们有一个Book类和一个Bookstore类来对应上面的 XML 结构:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.util.ArrayList; import java.util.List; class Book { private String title; private String author; private int year; private double price; // 构造函数、getter和setter方法省略 } class Bookstore { private List<Book> books = new ArrayList<>(); public void addBook(Book book) { books.add(book); } // 其他方法省略 }
- 以下是使用 JAXB 将Bookstore对象转换为 XML 并保存的示例代码:
public class WriteXMLWithJAXB { public static void main(String[] args) { try { Bookstore bookstore = new Bookstore(); Book book = new Book(); book.setTitle("Another New Book"); book.setAuthor("New Author"); book.setYear(2024); book.setPrice(35.0); bookstore.addBook(book); JAXBContext jaxbContext = JAXBContext.newInstance(Bookstore.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(bookstore, new File("jaxb_books.xml")); } catch (JAXBException e) { e.printStackTrace(); } } }
在这个示例中,首先创建了Bookstore和Book对象,并设置了相关属性。然后通过JAXBContext和Marshaller将Bookstore对象转换为 XML 格式并保存到文件中。setProperty方法用于设置输出格式为格式化后的 XML。
总结
到此这篇关于JAVA日常开发中读写XML的文章就介绍到这了,更多相关JAVA读写XML详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!