📜  Java XML-解析器(1)

📅  最后修改于: 2023-12-03 15:15:58.274000             🧑  作者: Mango

Java XML解析器

介绍

Java XML解析器用于解析XML文件,它是Java内置的一个库。Java XML解析器提供了三种解析方式:DOM(文档对象模型)、SAX(简单API for XML)和StAX(流API for XML)。其中,DOM是一种内存分配大、效率低的方式。它将整个XML文档读入内存中,形成一棵树状结构,我们可以通过遍历这个树来获取数据。SAX则是一种基于事件的解析方式,相对于DOM而言在效率方面要高许多。StAX是一种介于DOM和SAX之间的一种解析方式,它基于流,同时也提供了遍历方式。

DOM解析
使用步骤

DOM解析需要分为以下几个步骤:

  1. 创建一个DocumentBuilderFactory,通过DocumentBuilderFactory工厂创建一个DocumentBuilder;
  2. 使用DocumentBuilder的parse()方法将xml文件解析成Document对象;
  3. 通过Document对象获取节点,再获取节点中的数据。
代码示例
// 创建解析工厂
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解析
使用步骤

SAX解析需要分为以下几个步骤:

  1. 创建一个SAXParserFactory,通过SAXParserFactory工厂创建一个SAXParser;
  2. 实现DefaultHandler,重写它的startElement()、endElement()、characters()等方法;
  3. 使用SAXParser的parse()方法将xml文件解析成Document对象。
代码示例
// 创建解析工厂
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解析
使用步骤

StAX解析需要分为以下几个步骤:

  1. 创建一个XMLInputFactory,通过XMLInputFactory工厂创建一个XMLStreamReader;
  2. 使用XMLStreamReader的next()方法遍历XML文件,通过getLocalName()和getText()方法获取节点中的数据。
代码示例
// 创建解析工厂
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);
    }
  }
}

以上三种解析方式各有优缺点,需要根据不同的业务场景选择不同的解析方式。