本文是我在学习《Java核心技术》第九版卷II(高级特性)时写的一段代码。原书作者为(美)Cay S. Horstmann,Gary Cornell,译者为陈昊鹏、王浩、姚建平等。我的Java版本为1.8
Java提供了两种XML解析器:树型解释器DOM(Document Object Model,文档对象模型),和流机制解析器SAX(Simple API for XML,XML简单API)。流机制解析器StAX(Streaming API for XML)是一种“拉解析器”,与安装事件处理器不同,可以使用循环来迭代所有的事件。
XML文档内容如下:
文件名:NameList.xml,文件路径:C:\Users\Tsybius\Desktop\NameList.xml
TEXT
Java代码如下:
package XmlStaxTest;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamConstants;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamReader;/** * 使用StAX解析XML * @author Tsybius2014 * @date 2015年12月4日 * @time 下午9:02:29 * @remark * */class XmlStaxTest { /** * 使用StAX解析XML * @param args */ public static void main(String[] args) { String filePath = "C:\\Users\\Tsybius\\Desktop\\NameList.xml"; InputStream stream; try { stream = new FileInputStream(filePath); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader parser = factory.createXMLStreamReader(stream); while (parser.hasNext()) { int event = parser.next(); if (event == XMLStreamConstants.START_DOCUMENT) { System.out.println("文档开始"); } else if (event == XMLStreamConstants.END_DOCUMENT) { System.out.println("文档结束"); } else if (event == XMLStreamConstants.START_ELEMENT) { System.out.println("节点开始:" + parser.getLocalName()); if (parser.getLocalName().equals("person")) { for (int i = 0; i < parser.getAttributeCount(); i++) { System.out.print(parser.getAttributeName(i) + ":"); System.out.print(parser.getAttributeValue(i) + ";"); } System.out.println(); } } else if (event == XMLStreamConstants.END_ELEMENT) { System.out.println("节点结束:" + parser.getLocalName()); } else if (event == XMLStreamConstants.CHARACTERS) { String text = parser.getText(); if (!text.isEmpty() && text.trim().length() > 0) { System.out.println("值:" + parser.getText()); } } } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XMLStreamException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("END"); }}
控制台中输出结果如下:
节点开始:root节点开始:list1节点开始:personid:101;name:Tsybius;remark:1;节点结束:person节点开始:personid:102;name:Galatea;remark:2;节点结束:person节点开始:personid:103;name:Quintus;remark:3;节点结束:person节点开始:personid:104;name:Atia;remark:4;节点结束:person节点开始:personid:105;name:Justitia;remark:5;节点结束:person节点结束:list1节点开始:list2节点开始:personid:201;name:Zhang;remark:a;节点结束:person节点开始:personid:202;name:Wang;remark:b;节点结束:person节点开始:personid:203;name:Li;remark:c;节点结束:person节点开始:personid:204;name:Zhao;remark:d;节点结束:person节点开始:personid:205;name:Liu;remark:e;节点结束:person节点结束:list2节点开始:text值:TEXT节点结束:text节点结束:root文档结束END
END