我目前正在尝试解析groovy中包含混合文本和节点文本的节点,我需要以正确的顺序获取文本,例如:
<?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
如果我能得到一个p
下所有元素的列表,我可以测试它是一个节点或文本,我会很高兴,但我找不到任何方法来实现它。
答案 0 :(得分:3)
NodeChild
没有一个方法可以为您提供子文本和子节点,但Node
可以。只需使用childNodes()
(因为slurper会为您提供NodeChild
)
def root = new XmlSlurper().parse(xml)
root.childNodes().each { target ->
for (s in target.children()) {
if (s instanceof groovy.util.slurpersupport.Node) {
println "Node: "+ s.text()
} else {
println "Text: "+ s
}
}
}
这给了我结果:
Text: The text has
Node: nodes
Text: which need to get parsed
这意味着我可以轻松地对我的节点做任何我想要的事情,而它们仍然是正确的顺序与文本
答案 1 :(得分:0)
这里有一个有效的例子:
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'
我想没有CDATA
标签就无法做到。
答案 2 :(得分:0)
您可以像这样使用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])