Groovy XmlSlurper解析混合文本和节点
我目前正在尝试解析groovy中的一个节点,该节点包含混合文本和带文本的节点,我需要以正确的顺序获取文本,例如:Groovy XmlSlurper解析混合文本和节点,xml,groovy,xml-parsing,xmlslurper,Xml,Groovy,Xml Parsing,Xmlslurper,我目前正在尝试解析groovy中的一个节点,该节点包含混合文本和带文本的节点,我需要以正确的顺序获取文本,例如: <?xml version="1.0" encoding="UTF-8"?> <root> <p> The text has <strong>nodes</strong> which need to get parsed </p> </root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<p>
The text has
<strong>nodes</strong>
which need to get parsed
</p>
</root>
文本已被删除
节点
哪些需要被解析
现在我想对它进行解析,这样我就可以得到整个文本,但仍然可以编辑节点。
在本例中,我希望得到以下结果:
The text has <b>nodes</b> which need to get parsed
Text: The text has
Node: nodes
Text: which need to get parsed
文本有需要解析的节点
如果我能得到
p
下所有元素的列表,在那里我可以测试它是否是一个节点或文本,我会很高兴,但我找不到任何方法得到它。这里有一个工作示例:
def txt = '''
<root>
<p>
<![CDATA[The text has <strong>nodes</strong> which need to get parsed]]>
</p>
</root>
'''
def parsed = new XmlSlurper(false,false).parseText(txt)
assert parsed.p[0].text().trim() == 'The text has <strong>nodes</strong> which need to get parsed'
def txt=''
需要解析的节点。]>
'''
def parsed=new-XmlSlurper(false,false).parseText(txt)
assert parsed.p[0].text().trim()==“文本具有需要解析的节点”
我想没有CDATA标签是不可能的。您可以像这样使用XmlUtil和XmlParser:
import groovy.xml.*
def xml = '''<?xml version="1.0" encoding="UTF-8"?>
<root>
<p>
The text has
<strong>nodes</strong>
which need to get parsed
</p>
</root>'''
println XmlUtil.serialize(new XmlParser().parseText(xml).p[0])
导入groovy.xml*
def xml=''
文本已被删除
节点
哪些需要被解析
'''
println XmlUtil.serialize(新的XmlParser().parseText(xml).p[0])
好的,我找到了一个不用任何(棘手的)解决办法就可以使用的解决方案。 问题是,
NodeChild
没有一个方法可以同时提供子文本和子节点,但是节点可以。只需使用childNodes()
(因为slurper会给您一个NodeChild
)
这给了我一个结果:
The text has <b>nodes</b> which need to get parsed
Text: The text has
Node: nodes
Text: which need to get parsed
这意味着我可以轻松地对我的节点执行任何我想执行的操作,而它们与文本的顺序仍然正确如果我理解正确,“CDATA”标记会告诉他“按原样”阅读,而不解析节点,对吗?问题是,我无法在不修改xmlYes的情况下操作我必须处理的数据,这就是CDATA的目的。问题是这不是一个有效的XML文件。不知道如何在不改变的情况下处理它。XML是完全有效的Hanks@tim_yates。不使用CDATA就可以解析它吗?