Stax处理XML,基于迭代模型的查找,关键在于:
使用XMLInputFactory创建XMLEventReader,获取了eventReader之后,(在while循环hasNext中)通过XMLEvent来获取是否是某种节点类型,通过event.asxxx转换节点。
(1)测试一:基于迭代模型的查找
/**
* 基于迭代模型的查找
*/
@Test
public void test04() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream is = null;
try {
is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
//基于迭代模型的操作方式
XMLEventReader reader = factory.createXMLEventReader(is);
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();
} finally {
try {
if(is != null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果:
Everyday Italian: 30.00
Harry Potter: 29.99
XQuery Kick Start: 49.99
Learning XML: 39.95
85
(2)测试二:基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,然后while只在eventFilter返回的结果集中循环,减少循环次数、提高效率。
/**
* 过滤器的使用
*/
@Test
public void test05() {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream is = null;
try {
is = TestStax.class.getClassLoader().getResourceAsStream("books.xml");
//基于Filter的过滤方式,可以有效的过滤掉不用进行操作的节点,效率会高一些
XMLEventReader reader = factory.createFilteredReader(factory.createXMLEventReader(is),
new EventFilter() {
@Override
public boolean accept(XMLEvent event) {
//返回true表示会显示,返回false表示不显示
if(event.isStartElement()) {
String name = event.asStartElement().getName().toString();
//eventReader结果集中只显示标题和价格
if (("title").equals(name) || ("price").equals(name))
return true;
}
return false;
}
});
int num = 0;
//while只在eventFilter返回的结果集中循环
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();
} finally {
try {
if(is != null) is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果:
Everyday Italian: 30.00
Harry Potter: 29.99
XQuery Kick Start: 49.99
Learning XML: 39.95
8