我正在使用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。否则,我对此有很多怪异的主意,它们肯定会吞噬性能! ;)
感谢您阅读和提出任何想法! :)埃里克
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>