📅  最后修改于: 2023-12-03 15:15:58.274000             🧑  作者: Mango
Java XML解析器用于解析XML文件,它是Java内置的一个库。Java XML解析器提供了三种解析方式:DOM(文档对象模型)、SAX(简单API for XML)和StAX(流API for XML)。其中,DOM是一种内存分配大、效率低的方式。它将整个XML文档读入内存中,形成一棵树状结构,我们可以通过遍历这个树来获取数据。SAX则是一种基于事件的解析方式,相对于DOM而言在效率方面要高许多。StAX是一种介于DOM和SAX之间的一种解析方式,它基于流,同时也提供了遍历方式。
DOM解析需要分为以下几个步骤:
// 创建解析工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 使用工厂创建解析器
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析xml文件
Document document = builder.parse("data.xml");
// 获取根节点
Element rootElement = document.getDocumentElement();
// 获取节点列表
NodeList nodeList = rootElement.getElementsByTagName("book");
// 遍历节点列表,获取节点中的数据
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element element = (Element) node;
String title = element.getElementsByTagName("title").item(0).getTextContent();
String author = element.getElementsByTagName("author").item(0).getTextContent();
String price = element.getElementsByTagName("price").item(0).getTextContent();
System.out.println("标题:" + title + ",作者:" + author + ",价格:" + price);
}
}
SAX解析需要分为以下几个步骤:
// 创建解析工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 使用工厂创建解析器
SAXParser parser = factory.newSAXParser();
// 解析xml文件
DefaultHandler handler = new DefaultHandler() {
boolean isTitle = false;
boolean isAuthor = false;
boolean isPrice = false;
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("title")) {
isTitle = true;
}
if (qName.equalsIgnoreCase("author")) {
isAuthor = true;
}
if (qName.equalsIgnoreCase("price")) {
isPrice = true;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("book")) {
System.out.println();
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (isTitle) {
System.out.print("标题:" + new String(ch, start, length));
}
if (isAuthor) {
System.out.print(", 作者:" + new String(ch, start, length));
}
if (isPrice) {
System.out.print(", 价格:" + new String(ch, start, length) + "\n");
}
isTitle = false;
isAuthor = false;
isPrice = false;
}
};
parser.parse("data.xml", handler);
StAX解析需要分为以下几个步骤:
// 创建解析工厂
XMLInputFactory factory = XMLInputFactory.newInstance();
// 使用工厂创建解析器
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("data.xml"));
// 遍历xml文件
String title = "";
String author = "";
String price = "";
while (reader.hasNext()) {
int eventType = reader.next();
if (eventType == XMLStreamReader.START_ELEMENT) {
if (reader.getLocalName().equals("title")) {
title = reader.getElementText();
}
if (reader.getLocalName().equals("author")) {
author = reader.getElementText();
}
if (reader.getLocalName().equals("price")) {
price = reader.getElementText();
System.out.println("标题:" + title + ",作者:" + author + ",价格:" + price);
}
}
}
以上三种解析方式各有优缺点,需要根据不同的业务场景选择不同的解析方式。