2017-01-18 8 views
0

У меня есть XML-документ, что я синтаксический анализ, который имеет такие элементы, как это ...Как печатать текстовые значения в XML-документ с XMLEventReader, когда некоторые элементы не имеют текста

<item> 
    <g:product_type>Accessories</g:product_type> 
    <g:item_group_id>85953</g:item_group_id> 
    <g:tax> 
    <g:country>US</g:country> 
    <g:rate>0.00</g:rate> 
    </g:tax> 
</item> 

Обратите внимание, как некоторые такие элементы, как product_type и item_group, имеют текстовые значения, но элемент налога имеет вспомогательные элементы (не имеет собственного текстового значения).

Я разборе это с XMLEventReader, и если элемент имеет текст, то я хочу, чтобы напечатать ....

XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
InputStream in = read(); 
XMLEventReader eventReader = inputFactory.createXMLEventReader(in); 

while (reader.hasNext()){ 
     XMLEvent event = reader.nextEvent() 
     if (event.isStartElement()){ 
      System.out.println("The value is" + reader.elementText); 
     } 
    } 

Но прямо сейчас, потому что у меня есть, что один элемент, который не имеет текста, он дает ошибку, как это ..

elementGetText() function expects text only elment but START_ELEMENT was encountered. 
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getElementText(XMLStreamReaderImpl.java:851) 
at com.sun.xml.internal.stream.XMLEventReaderImpl.getElementText(XMLEventReaderImpl.java:188) 

Как я могу изменить код выше, так XMLEventReader игнорирует такие элементы, которые не имеют текста? Я не видел ничего в java docs, чтобы проверить, является ли элемент текстом.

+0

- это требование sax или вас будут интересовать некоторые более простые решения, чем использование stax? –

ответ

0

Вы можете использовать метод peek(), чтобы проверить, каким будет следующее событие. Затем вы можете использовать метод isCharacters() в полученном XMLEvent, чтобы узнать, является ли следующее событие текстовым. Используйте метод asCharacters(), чтобы получить объект Characters. Обратите внимание, что вам нужно протестировать isIgnorableWhiteSpace(), чтобы не было пустого пространства между открывающим тегом и другим открывающим тегом без значительного текста.

Вы также должны установить свойство javax.xml.stream.isCoalescing в Boolean.TRUE в своем XMLInputFactory перед созданием устройства для чтения событий. Таким образом, текст не будет разбит на отдельные события, но будет отображаться как один фрагмент между тегами. В противном случае большие фрагменты текста или узлы с новыми символами в них могут генерировать несколько событий.

Возможно, вы хотите сделать что-то более сложное с этими текстовыми узлами, но если нет, вы можете получить тот же результат просто с помощью преобразования XSLT.

Смежные вопросы