【问题标题】:How to print the text values of an XML doc with XMLEventReader when some elements don't have text当某些元素没有文本时,如何使用 XMLEventReader 打印 XML 文档的文本值
【发布时间】:2017-01-18 19:57:26
【问题描述】:

我有一个正在解析的 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 中没有看到任何内容来检查元素是否为文本。

【问题讨论】:

  • 是否需要 sax,或者您会对比使用 stax 更简单的解决方案感兴趣?

标签: java xml xml-parsing stax


【解决方案1】:

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

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

也许您希望最终对这些文本节点执行更复杂的操作,但如果不这样做,您也可以非常简单地使用 XSLT 转换获得相同的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多