如何将XML格式的String转换为单行XML字符串,grails / groovy中没有空格?

时间:2012-02-22 04:15:03

标签: xml grails groovy

我想知道是否有更简单的方法将带有换行符和标签的XML格式字符串转换为一行没有格式的单行xml字符串。 目前我正在考虑做

s.replaceAll("\n",""); 
s.replaceAll("\t","");

但是在grails / groovy中有更好的方法吗?

输入XML:

<chart subCaption="Mon, 24 Oct 2011-Tue, 21 Feb 2012" outCnvBaseFont="Arial" outCnvBaseFontSize="12" xAxisName="Day of the Month" yAxisName="Distinct User Count" formatNumberScale="0" decimalPrecision="0" showvalues="0" animation="1" numdivlines="3" numVdivlines="0" lineThickness="3" rotateNames="1">
  <categories>
    <category Label="Nov/28" showName="1" />
    <category Label="Nov/29" showName="0" />
    <category Label="Nov/30" showName="0" />
    <category Label="Dec/01" showName="0" />
    <category Label="Dec/02" showName="1" />
    <category Label="Dec/03" showName="0" />
    <category Label="Dec/04" showName="0" />
  </categories>
  <dataset seriesName="view/export" color="F5497D" showValue="1" alpha="100" anchorAlpha="0" lineThickness="2">
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
  </dataset>
</chart>

输出xml

<chart subCaption="Mon, 24 Oct 2011-Tue, 21 Feb 2012" outCnvBaseFont="Arial" outCnvBaseFontSize="12" xAxisName="Day of the Month" yAxisName="Distinct User Count" formatNumberScale="0" decimalPrecision="0" showvalues="0" animation="1" numdivlines="3" numVdivlines="0" lineThickness="3" rotateNames="1"><categories><category Label="Nov/28" showName="1" /><category Label="Nov/29" showName="0" /><category Label="Nov/30" showName="0" /><category Label="Dec/01" showName="0" /><category Label="Dec/02" showName="1" /><category Label="Dec/03" showName="0" /><category Label="Dec/04" showName="0" /></categories><dataset seriesName="view/export" color="F5497D" showValue="1" alpha="100" anchorAlpha="0" lineThickness="2"><set value="0" /><set value="0" /><set value="0" /><set value="0" /><set value="0" /><set value="0" /><set value="0" /></dataset></chart>

3 个答案:

答案 0 :(得分:3)

此脚本可能也有帮助:

unpretty = pretty.replaceAll(/>(\n|\t|\s)*</, '><')
                 .replaceAll(/\n|\t/, ' ')
                 .replaceAll(/\s+/, ' ')

删除尖括号之间的额外\ n,\ t,\ s,并将额外的\ n,\ t,\ s转换为单个空格内/外标记。

答案 1 :(得分:0)

如果你只想摆脱\ t和\ n,那么你可以这样做:

s.collect { it != "\n" && it != "\t" ? it : "" }.join()

当然,这假设没有语义相关的空格字符作为属性值。

这将实现与您的示例相同的效果,但它不会删除空格。删除空格要困难得多,因为在属性名称和标记名称之间至少需要一个空白字符,并且不能从值中删除它们。

我认为没有简短或优雅的方式来做到这一点。您需要使用真正的XML解析器。像XMLSlurper这样的东西将是一个良好的开端。


修改

另一种可能性是这样的:

def root = new XmlParser().parseText(xml)
new XmlNodePrinter(preserveWhitespace:false).print(root.body[0])

此解决方案的问题在于字符串是使用换行符和缩进打印的,但您可以将第一个示例与第二个示例结合使用以转换漂亮打印的字符串。

答案 2 :(得分:0)

我能想到的最简单的解决方案是使用正则表达式替换尖括号之间的所有空白字符,如下所示:

def test = '''<chart subCaption="Mon, 24 Oct 2011-Tue, 21 Feb 2012" outCnvBaseFont="Arial" outCnvBaseFontSize="12" xAxisName="Day of the Month" yAxisName="Distinct User Count" formatNumberScale="0" decimalPrecision="0" showvalues="0" animation="1" numdivlines="3" numVdivlines="0" lineThickness="3" rotateNames="1">
  <categories>
    <category Label="Nov/28" showName="1" />
    <category Label="Nov/29" showName="0" />
    <category Label="Nov/30" showName="0" />
    <category Label="Dec/01" showName="0" />
    <category Label="Dec/02" showName="1" />
    <category Label="Dec/03" showName="0" />
    <category Label="Dec/04" showName="0" />
  </categories>
  <dataset seriesName="view/export" color="F5497D" showValue="1" alpha="100" anchorAlpha="0" lineThickness="2">
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
    <set value="0" />
  </dataset>
</chart>
'''

println test.replaceAll(/>\s+</, '><')

这在我的测试中起作用。此外,由于尖括号在属性内部无效,因此不应影响任何内部内容。

但是,它不会删除属性之间的额外空格。