-1

我正在使用 XmlParser 读取具有以下内容的 XML 文档:

<instructions size='1'>
   <instruction key='manifest'>
      Bundle-SymbolicName: org.slf4j.api&#xA;Bundle-Version: 1.6.4.v20120130-2120
   </instruction>
</instruction>

注意在第 3 行有换行符的实体,&#xA;

问题是当我使用 Groovy 的 XmlNodePrinter 打印出此文档时(在我的情况下,我已对文档的其他地方进行了更改),节点打印机将打印出文本节点并使用真正的换行符而不是%#xA;

<instructions size='1'>
   <instruction key='manifest'>
      Bundle-SymbolicName: org.slf4j.api
Bundle-Version: 1.6.4.v20120130-2120
   </instruction>
</instruction>

我为 XmlParser 对象设置了 trimWhitespace=false 并为 XmlNodePrinter 设置了 preserveWhitespace=true 但这不会改变上述行为。

4

1 回答 1

1

您可以将文本包装在里面<![CDATA...]]>

<instructions size='1'>

   <instruction key='manifest'> 
   <![CDATA[       
       Bundle-SymbolicName: org.slf4j.api&amp;#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&amp;#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", "&#xA;")
      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&#xA;Bundle-Version: 1.6.4.v20120130-2120
   </instruction>
</instructions>

MyXmlNodePrinter是微不足道的并且不会执行转义,因此您可能需要private void printEscaped(String s, boolean isAttributeValue)XmlNodePrinter. XmlNodePrinter您可以在https://github.com/groovy/groovy-core/blob/master/subprojects/groovy-xml/src/main/java/groovy/util/XmlNodePrinter.java中找到源代码

于 2013-02-06T16:09:52.973 回答