Groovy XmlSlurper解析混合文本和节点

时间:2014-08-05 09:50:12

标签: 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>

现在我想要它解析所以我得到了整个文本,但仍然可以编辑节点。 在这个例子中,我想要结果:

The text has <b>nodes</b> which need to get parsed

如果我能得到一个p下所有元素的列表,我可以测试它是一个节点或文本,我会很高兴,但我找不到任何方法来实现它。

3 个答案:

答案 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])