2017-01-18 23 views
0

我有我解析它有这样的元素的XML文档...如何使用XMLEventReader的打印XML文档的文本值时,一些元素没有文本

<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这样的元素具有文本值,但tax元素具有子元素(没有自己的文本值)。

我解析这个与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

是一个需求,或者你会比使用stax更简单的解决方案感兴趣吗? –

回答

0

您可以使用方法peek()来检查下一个事件将会发生什么。然后,您可以在产生的XMLEvent上使用方法isCharacters()来确定下一个事件是否为文本。使用其上的方法asCharacters()获取Characters对象。请注意,您需要测试isIgnorableWhiteSpace(),以便不报告没有明显文本的开始标记和另一个开始标记之间的空白空间。

在创建事件阅读器之前,您还需要在XMLInputFactory中将属性javax.xml.stream.isCoalescing设置为Boolean.TRUE。这样,文本就不会被分解成单独的事件,而是作为标签之间的一个块进行报告。否则,较大的文本或带有换行符的节点可能会生成多个事件。

也许你想最终完成一些与这些文本节点更复杂的事情,但是如果没有,你也可以使用XSLT转换获得相同的结果。