我真的不明白你要做什么,但如果你想要标签的本地名称导致START_ELEMENT事件,你可以这样做:
if (event.getEventType() == START_ELEMENT) {
QName qname = event.asStartElement().getName()
System.out.println("Start of element " + qname.getLocalPart());
}
就个人而言,我通常会发现XMLStreamReader在大多数情况下对我来说更方便,但我认为这取决于用例以及您自己的个人偏好.专家提示,架构越严格,使用StAX解析数据就越容易.
您可能还希望查看JAX-B以获取自动XML数据绑定.
编辑:这是OP中XML的一个天真的递归下降StAX解析器:
@Test
public void recursiveDescentStaxParser( ) throws XMLStreamException,
FactoryConfigurationError
{
String msg = "John1Small Publishing House37.8";
XMLStreamReader reader = XMLInputFactory.newFactory( )
.createXMLStreamReader( new StringReader( msg ) );
reader.nextTag( );
readRoot( reader );
}
private void readRoot( XMLStreamReader reader ) throws XMLStreamException
{
while ( reader.nextTag( ) == XMLEvent.START_ELEMENT )
{
QName name = reader.getName( );
if ( "B".equals( name.getLocalPart( ) ) )
readBooks( reader );
else
reader.nextTag( ); // Empty
}
}
private void readBooks( XMLStreamReader reader ) throws XMLStreamException
{
while ( reader.nextTag( ) == XMLEvent.START_ELEMENT )
{
QName name = reader.getName( );
if ( !"Book".equals( name.getLocalPart( ) ) )
throw new XMLStreamException( name.toString( ) );
reader.nextTag( ); // Jump to
readBook( reader );
reader.nextTag( ); // Jump to
}
}
private void readBook( XMLStreamReader reader ) throws XMLStreamException
{
reader.nextTag( ); // Skip to
System.out.println( "Author: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to
System.out.println( "Edition: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to
System.out.println( "Publisher: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to
System.out.println( "Price: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to
}
写这样的东西不仅使代码更易于阅读和推理,而且还会在错误弹出时出现堆栈跟踪.