📅  最后修改于: 2023-12-03 15:01:32.792000             🧑  作者: Mango
XML全名是扩展标记语言,它是一种标记语言,它的目的是为了让不同的软件系统之间能够互相传递数据,XML的语法与HTML和SGML很相似,但是它被设计成具有通用性和扩展性,在各种应用领域中都能发挥作用。
XML的基本结构是由标签、属性、值组成的,每个标签都是成对出现的,并且可以嵌套。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>
Java提供了许多工具类和API来处理XML文件。其中最基本的就是JAXP,它是Java API for XML Processing的缩写,它提供了DOM和SAX两种解析方式。
DOM全称是Document Object Model,即文档对象模型。DOM会将整个XML文档加载进内存中作为一个树形结构,开发者可以通过访问树上的节点来解析XML文件。
具体来说,先创建一个DocumentBuilderFactory实例,然后用它创建一个DocumentBuilder对象,再通过DocumentBuilder对象的parse方法将XML文件解析成一个Document对象:
File xmlFile = new File("bookstore.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xmlFile);
针对上面的例子,假设我们已经获取了bookstore节点,需要获取其中的title元素的值。可以通过如下代码实现:
NodeList bookList = doc.getElementsByTagName("book");
for (int i = 0; i < bookList.getLength(); i++) {
Node bookNode = bookList.item(i);
Element bookElement = (Element) bookNode;
if (bookElement.getAttribute("category").equals("cooking")) {
Node titleNode = bookElement.getElementsByTagName("title").item(0);
String title = titleNode.getTextContent();
System.out.println("Title : " + title);
}
}
SAX全称是Simple API for XML,即XML的简单API。SAX是基于事件驱动的解析方式,所以它的解析效率比DOM高,同时它也比DOM更节省内存。
SAX解析的方式是将XML文档作为输入流,解析过程中SAX会识别各种标签,当它遇到一个节点时,就会产生一个事件,开发者可以自己定义事件的处理逻辑。
具体来说,先创建一个SAXParserFactory实例,然后用它创建一个SAXParser对象,再将XML文件作为输入流传给SAXParser对象的parse方法即可。
File xmlFile = new File("bookstore.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(xmlFile, new MyHandler());
其中MyHandler即为自定义的事件处理器,如果需要获取bookstore节点中title元素的值,可以在MyHandler中重写startElement方法:
class MyHandler extends DefaultHandler {
boolean isTitle = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("title")) {
isTitle = true;
}
}
@Override
public void characters(char ch[], int start, int length) throws SAXException {
if (isTitle) {
System.out.println("Title : " + new String(ch, start, length));
isTitle = false;
}
}
}
以上就是Java中XML的概述和DOM、SAX解析方式的基本使用方法,虽然Java中还有其他的XML工具类和API,但是它们都是在这些基础之上构建而成的。如果想要深入了解XML的使用方法,可以参考Java官方文档或者其他专业书籍。