XMLInputFactory 定义用于获取流的工厂的抽象实现
XMLStreamReader 接口允许转发 XML 和对 XML 的只读访问。它被设计为读取 XML 数据的最低层且最有效的方法。
XMLStreamReader 被设计为使用 next() 和 hasNext() 在 XML 上进行迭代。可以使用诸如 getEventType()、getNamespaceURI()、getLocalName() 和 getText() 之类的方法访问数据:
next() 方法会使 reader 读取下一个解析事件。next() 方法返回一个整数,指示刚才读取的事件类型。
访问xml一般操作步骤如下:
InputStream is = XMLTest.class.getClassLoader().getResourceAsStream("books.xml");
XMLInputFactory factory = XMLInputFactory.newFactory();
//下面是两种方式访问xml
//XMLStreamReader reader = factory.createXMLStreamReader(is);
XMLEventReader reader = factory.createXMLEventReader(is);
package hb.xml;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import org.junit.Test;
public class XMLTest {
//books.xml存放的位置是在src目录下面
InputStream is = XMLTest.class.getClassLoader().getResourceAsStream("books.xml");
XMLInputFactory factory = XMLInputFactory.newFactory();
@Test
//根据节点类型访问XML里面的数据
public void nodeTypeDemo() {
try {
XMLStreamReader reader = factory.createXMLStreamReader(is);
while(reader.hasNext()) {
int type = reader.next();
//判断节点类型是否是开始或者结束或者文本节点,之后根据情况及进行处理
if(type==XMLStreamConstants.START_ELEMENT) {
String name = reader.getName().toString();
System.out.println(name);
//获取节点的属性
if(name.equals("book")) {
System.out.println(reader.getAttributeName(0)+":"+reader.getAttributeValue(0));
}
} else if(type==XMLStreamConstants.CHARACTERS) {
System.out.println(reader.getText().trim());
} else if(type==XMLStreamConstants.END_ELEMENT) {
System.out.println("/"+reader.getName());
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
} finally {
try {
if(is!=null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
// 基于迭代模型的操作方式
public void eventDemo() {
try {
XMLEventReader reader = factory.createXMLEventReader(is);
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isStartDocument()) {
System.out.println("startDocument");
}
if (event.isStartElement()) {
String name = event.asStartElement().getName().toString();
if ("title".equals(name)) {
System.out.println(reader.getElementText());
}
}
}
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
@Test
public void filterDemo() {
try {
XMLEventReader reader = factory.createXMLEventReader(is);
factory.createFilteredReader(reader, new EventFilter() {
@Override
//返回true表示会显示,如果是false则不会显示
public boolean accept(XMLEvent xmlevent) {
if (xmlevent.isStartDocument()) {
String name = xmlevent.asStartElement().getName().toString();
System.out.println(name);
return true;
}
return false;
}
});
int num = 0;
while(reader.hasNext()) {
//通过XMLEvent来获取是否是某种节点类型
XMLEvent event = reader.nextEvent();
if(event.isStartElement()) {
//通过event.asxxx转换节点
String name = event.asStartElement().getName().toString();
if(name.equals("title")) {
System.out.print(reader.getElementText()+":");
}
if(name.equals("price")) {
System.out.print(reader.getElementText()+"\n");
}
}
num++;
}
System.out.println(num);
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}