Я не совсем понимаю, что вы пытаетесь сделать, но если вы хотите, чтобы локальное имя тега вызывало событие START_ELEMENT
, вы можете сделать это так:
if (event.getEventType() == START_ELEMENT) {
QName qname = event.asStartElement().getName()
System.out.println("Start of element " + qname.getLocalPart());
}
Аналогично, asEndElement
, asCharacters
и т. Д. Обеспечивают доступ к другим типам узлов.
Лично я обычно нахожу, что XMLStreamReader
удобнее для меня в большинстве ситуаций, но я полагаю, что это зависит от варианта использования, а также от ваших личных предпочтений.Совет состоит в том, что чем строже схема, тем проще анализировать данные с помощью StAX.
Возможно, вы также захотите посмотреть JAX-B для автоматической привязки данных XML.*
Редактировать: Вот наивный анализатор StAX с рекурсивным спуском для XML в OP:
@Test
public void recursiveDescentStaxParser( ) throws XMLStreamException,
FactoryConfigurationError
{
String msg = "<ns1:Root xmlns:ns1=\"http://rootNameSpace.com/\"><ns1:A/><ns1:B><Book xmlns=\"http://www.myNameSpace.com\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><Data><Author>John</Author><Edition>1</Edition><PubHouse>Small Publishing House</PubHouse><Price>37.8</Price></Data></Book></ns1:B></ns1:Root>";
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 <A>
}
}
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 <Data>
readBook( reader );
reader.nextTag( ); // Jump to </B>
}
}
private void readBook( XMLStreamReader reader ) throws XMLStreamException
{
reader.nextTag( ); // Skip to <Author>
System.out.println( "Author: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to <Edition>
System.out.println( "Edition: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to <PubHouse>
System.out.println( "Publisher: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to <Price>
System.out.println( "Price: " + reader.getElementText( ) );
reader.nextTag( ); // Skip to </Book>
}
Подобные записи не только делают код намного прощечитать и рассуждать, но также и стек отслеживает, когда появляются ошибки.