|
大家可能已经发现,这里有一个与之前处理不同的地方,就是我们先打印了用户的信息,再调用next()方法;这与java.util.Iterator的先调用next()方法,再获取对象信息不同。而之前我们一直采用的是与Iterator一样的处理代码。这里,就有一个问题需要说明。
对于XMLStreamReader的next()方法来说,第一次被调用的时候返回的是第二个标记(或事件)。要获得第一个标记,就需要在调用next()方法之前调用getEventType()方法。这是需要注意的地方。我们以上的代码之所以采用Java迭代器一样的处理方式,是因为第一个标记总是START_DOCUMENT,而我们不需要对它进行操作,因此就采用了一种熟悉的编码方式,方便大家理解。XMLEventReader的nextEvent()方法就不存在这样的问题。
EventFilter的用法与StreamFilter相同,不再举例说明。
StAX还为我们提供了另外一种隔离标记或事件对象过滤逻辑的方法,那就是StreamReaderDelegate和EventReaderDelegate这两个类,它们都位于javax.xml.stream.util.*包中。StAX API中大部分都是接口,这两个是确确实实的类。它们都做了同样的工作,就是分别包装了XMLStreamReader和XMLEventReader,并把所有的方法都委托(Delegate)给它们处理,既没有增加任何的方法或逻辑,也没有改变或删除任何方法,因此这里使用的是策略(Strategy)模式。我们可以采用装饰(Decorator)模式,给StreamReaderDelegate或EventReaderDelegate增加新的功能。请看下面的例子:
/**
* 测试StreamReaderDelegate
*
* @author zangweiren 2010-4-19
*
*/
public class TestStreamDelegate {
public static void main(String[] args) {
TestStreamDelegate t = new TestStreamDelegate();
t.listUsers();
}
public XMLStreamReader getDelegateReader() {
String xmlFile = TestStreamFilter.class.getResource("/").getFile()
+ "users.xml";
XMLInputFactory factory = XMLInputFactory.newFactory();
XMLStreamReader reader;
try {
reader = new StreamReaderDelegate(factory
.createXMLStreamReader(new FileReader(xmlFile))) {
// 重写(Override)next()方法,增加过滤逻辑
@Override
public int next() throws XMLStreamException {
while (true) {
int event = super.next();
// 保留用户元素的开始
if (event == XMLStreamConstants.START_ELEMENT
&& "user".equalsIgnoreCase(getLocalName())) {
return event;
} else if (event == XMLStreamConstants.END_DOCUMENT) {
return event;
} else {
continue;
}
}
}
};
return reader;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (XMLStreamException e) {
e.printStackTrace();
}
return null;
}
public void listUsers() {
XMLStreamReader reader = this.getDelegateReader();
try {
while (reader.hasNext()) {
reader.next();
if (reader.getEventType() != XMLStreamConstants.END_DOCUMENT) {
// 列出用户的名称和年龄
System.out.println("Name="
+ reader.getAttributeValue(null, "name") + ";age="
+ reader.getAttributeValue(null, "age"));
}
}
reader.close();
} catch (XMLStreamException e) {
e.printStackTrace();
}
}
}
测试结果:
Name=Tom;age=28
Name=Lily;age=26
Name=Frank;age=32
Name=Bob;age=45
Name=Kate;age=25 |
|