当某些元素没有文本时,如何使用XMLEventReader打印XML文档的文本值

时间:2017-01-18 19:57:26

标签: java xml xml-parsing stax

我有一个我正在解析的XML文档,它包含这样的元素......

[WebMethod]
public static string CreateJob()
{
    //rest of my database code here
}

注意像product_type和item_group这样的元素有文本值,但tax元素有子元素(没有自己的文本值)。

我用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>

但是现在因为我有一个没有文字的元素,它会给出一个像这样的错误..

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);
         }
   }

如何修改上面的代码,以便XMLEventReader忽略没有文本的元素?我在java docs中没有看到任何内容来检查元素是否为文本。

1 个答案:

答案 0 :(得分:0)

您可以使用peek()方法检查下一个事件的内容。然后,您可以在生成的XMLEvent上使用方法isCharacters()来确定下一个事件是否为文本。使用方法asCharacters()获取Characters对象。请注意,您要测试isIgnorableWhiteSpace(),以便不会报告开头标记与另一个没有重要文本的开始标记之间的空格。

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

也许您希望最终对这些文本节点执行更复杂的操作,但如果没有,您也可以使用XSLT转换获得相同的结果。