如何在不转义CDATA节点值的情况下将Node对象转换为XML String?

时间:2015-08-05 12:39:41

标签: xml groovy

我使用groovy.util.Node来操作树结构,而不是以XML格式存储树。

某些节点值不需要转义。

创建树的代码:

def nodeValue = '<![CDATA[you&me]]>'
Node rootNode = new Node(null, 'parent', [:], nodeValue)
rootNode.append(new Node(null, 'child', [:], nodeValue))

我已尝试使用XmlUtil.serialize

println groovy.xml.XmlUtil.serialize(rootNode) // & escaped to &amp;

这是输出:

<?xml version="1.0" encoding="UTF-8"?><parent>&lt;![CDATA[you&amp;me]]&gt;  <child>&lt;![CDATA[you&amp;me]]&gt;</child>
</parent>

使用XmlNodePrinter:

def sw = new StringWriter()
new (new IndentPrinter(sw, '', false)).print(rootNode)
println sw.toString()  // & escaped to &amp;

输出:

<parent>&lt;![CDATA[you&amp;me]]&gt;<child>&lt;![CDATA[you&amp;me]]&gt;</child></parent>

为了避免CDATA转义,有人有一个常规的解决方案吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

您可以将StreamingMarkupBuildermkp.yieldUnescaped

一起使用
import groovy.xml.*

String xml = new StreamingMarkupBuilder().bind {
    def nodeValue = { ->
        mkp.yieldUnescaped '<![CDATA[you&me]]>'
    }
    parent {
        nodeValue()
        child {
            nodeValue()
        }
    }
}

assert xml == '<parent><![CDATA[you&me]]><child><![CDATA[you&me]]></child></parent>'