Groovy:打印XML标签内容"按原样#34;

时间:2014-04-29 08:09:10

标签: xml groovy

我有一个Groovy脚本,它使用XmlParser解析XML文件。我想打印一个包含XML / HTML代码的节点(见下文)。

XML文件如下所示:

<root>
  <name>myname</name>
  <version>1.0</version>
  <entry>
    <locale>en</locale>
    <rules>
      <rule>
        <pattern>with.html.text</pattern>
        <replace-value><em>emphasis {0}</em> is ok</replace-value>
      </rule>
    </rules>
  </entry>
</root>

我试过像:

StringWriter sw = new StringWriter()
PrintWriter pw = new PrintWriter(sw)
XmlNodePrinter nodePrinter = new XmlNodePrinter(new IndentPrinter(pw,"", false))
root = new XmlParser().parseText(myxml)
allRules = root.'rules'.rule.findAll()
allRules.each { aRule ->
    nodePrinter.print(aRule.'replace-value'[0])
    println sw.toString()
}

我希望:<em>emphasis {0}</em> is ok

但它会打印:<replace-value><em>emphasis {0}</em>is ok</replace-value>

如何避免使用<replace-value>代码并保留</em>和&#34之间的空格?&#34; ?

感谢您的帮助

编辑: 请注意,我的目标是将XML文件转换为CSV文件。 我更新了XML示例以更精确。规则附加到区域设置。 所以我需要能够为每个替换值元素检索哪个键以及必须应用哪个语言环境。

2 个答案:

答案 0 :(得分:1)

你可以做到这一点,但它并不漂亮:

def myxml = '''<root>
  <name>myname</name>
  <version>1.0</version>
  <entry>
    <locale>en</locale>
    <rules>
      <rule>
        <pattern>with.html.text</pattern>
        <replace-value><em>emphasis {0}</em> is ok</replace-value>
      </rule>
    </rules>
  </entry>
</root>'''

import groovy.xml.*

def root = new XmlParser().parseText( myxml )

root.entry.collectEntries { it ->
    [ locale:it.locale.text(),
      rule:it.rules.rule.'replace-value'[0].children().collect { node ->
          if( node instanceof String ) { node }
          else {
              new StringWriter().with { sw ->
                  new PrintWriter( sw ).with { pw ->
                      new XmlNodePrinter(new IndentPrinter(pw,"", false)).print( node )
                      sw.toString()
                  }
              }
          } 
      }.join() ]
}

感觉应该有一个更漂亮的解决方案,但目前我不知道: - (

答案 1 :(得分:0)

此处节点本身的数据具有元素标记。你可以把它放在像下面这样的CDATA中。

将它放入一个时髦的脚本中:

def myXml='''
<root>
  <name>myname</name>
  <version>1.0</version>
  <entry>
    <locale>en</locale>
    <rules>
      <rule>
        <pattern>with.html.text</pattern>
        <replace-value><![CDATA[<em>emphasis {0}</em> is ok]]></replace-value>
      </rule>
    </rules>
  </entry>
</root>'''

def rootNode = new XmlSlurper().parseText(myXml)
println rootNode.entry.rules.rule.'replace-value'