我正在使用XmlParser读取包含以下内容的XML文档:
<instructions size='1'>
<instruction key='manifest'>
Bundle-SymbolicName: org.slf4j.api
Bundle-Version: 1.6.4.v20120130-2120
</instruction>
</instruction>
在第3行注意,有换行实体

问题是当我使用Groovy的XmlNodePrinter打印出这个文档时(在我的情况下我已经在文档的其他地方进行了更改),节点打印机将打印出文本节点并使用真实换行而不是{{1 }}
%#xA;
我为XmlParser对象设置了trimWhitespace = false,并为XmlNodePrinter设置了preserveWhitespace = true,但这并没有改变上述行为。
答案 0 :(得分:1)
您可以将文字包装在<![CDATA...]]>
:
<instructions size='1'>
<instruction key='manifest'>
<![CDATA[
Bundle-SymbolicName: org.slf4j.api&#xA;Bundle-Version: 1.6.4.v20120130-2120
]]>
</instruction>
</instructions>
我正在使用以下代码对其进行测试:
def out = new StringWriter()
def xml = new XmlParser().parseText(new File("file.xml").text)
def printer = new XmlNodePrinter(new PrintWriter(out))
printer.print(xml)
println out.toString()
输出符合预期:
<instructions size="1">
<instruction key="manifest">
Bundle-SymbolicName: org.slf4j.api&#xA;Bundle-Version: 1.6.4.v20120130-2120
</instruction>
</instructions>
回应评论:
如果你真的别无选择,可以扩展XmlNodePrinter
(这是一个Java类)并创建Groovy代码,例如:
class MyXmlNodePrinter extends XmlNodePrinter {
MyXmlNodePrinter(PrintWriter out) {
super(out)
}
void printSimpleItem(Object value) {
value = value.replaceAll("\n", "
")
out.print(value)
}
}
def out = new StringWriter()
def xml = new XmlParser().parseText(new File("file.xml").text)
def printer = new MyXmlNodePrinter(new PrintWriter(out))
printer.print(xml)
println out.toString()
此代码的输出为:
<instructions size="1">
<instruction key="manifest">
Bundle-SymbolicName: org.slf4j.api
Bundle-Version: 1.6.4.v20120130-2120
</instruction>
</instructions>
MyXmlNodePrinter
是微不足道的,并且不会执行转义,因此您可能需要从private void printEscaped(String s, boolean isAttributeValue)
复制(和更改)XmlNodePrinter
。您可以在https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-xml/src/main/java/groovy/util/XmlNodePrinter.java
XmlNodePrinter
的源代码