Groovy的XmlParser丢失了CDATA指示器

问题描述 投票:0回答:1

我正在使用Groovy的XmlParser的parseText方法来解析XML字符串并返回一个对象(Node obj)以进行进一步的上游处理/操作。但是,该解析将剥离所有CDATA包装器。

示例。

import groovy.xml.XmlUtil

String xmlString = """
<stuff>
<people><![CDATA[Person01
Person02
Person03]]></people>
</stuff>
"""

Node xmlParsed = new XmlParser().parseText( xmlString )

print xmlParsed.people

print "\n----\n"

print XmlUtil.serialize( xmlParsed )

输出:

[people[attributes={}; value=[Person01
Person02
Person03]]]
----
<?xml version="1.0" encoding="UTF-8"?><stuff>
  <people>Person01
Person02
Person03</people>
</stuff>

因此您可以看到CDATA在输出中消失了。我已经尝试过使用最新的稳定Groovy(2.5.9)和3.0.0-rc-3使用相同的结果。

我有很多稳定的上游代码与XmlParser返回的Node对象一起使用,因此我希望可以做一些其他事情来保存CDATA。否则,我对此有很多怪异的主意,它们肯定会吞噬性能! ;)

感谢您阅读和提出任何想法! :)埃里克

xml groovy xml-parsing
1个回答
0
投票

XmlParser和XmlSlurper解析xml时,它们无法跟踪<![CDATA[节😕

尽管还有另一种选择,Java的dom类维护CDATA,并且Groovy提供了一个生成器来解析Reader中的元素,并提供了一个DOMCategory来为您提供dom元素上的gpath样式导航...

因此您可以执行以下操作:

import groovy.xml.DOMBuilder
import groovy.xml.XmlUtil
import groovy.xml.dom.DOMCategory

String xmlString = """
<stuff>
<people><![CDATA[Person01
Person02
Person03]]></people>
</stuff>
"""

def xmlParsed = DOMBuilder.parse(new StringReader(xmlString)).documentElement

use(DOMCategory) {
    println xmlParsed.people.text()
    println '----'
}
print XmlUtil.serialize(xmlParsed)

哪个维护CDATA:

Person01
Person02
Person03
----
<?xml version="1.0" encoding="UTF-8"?><stuff>

  <people>
    <![CDATA[Person01
Person02
Person03]]>
  </people>

</stuff>
© www.soinside.com 2019 - 2024. All rights reserved.