-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。のソースコードはXmlNodePrinterhttps://github.com/groovy/groovy-core/blob/master/subprojects/groovy-xml/src/main/java/groovy/util/XmlNodePrinter.javaにあります。

于 2013-02-06T16:09:52.973 に答える