Как преобразовать строку в формате XML в строку XML, состоящую из одной строки, без пробелов в grails / groovy? - PullRequest
2 голосов
/ 22 февраля 2012

Мне интересно, существует ли более простой способ преобразования строки в формате 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 ]

3 голосов
/ 18 февраля 2013

Этот сценарий также может быть полезен:

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

Удаляет лишние \ n, \ t, \ s между угловыми скобками и преобразует дополнительные \ n, \ t, \ s в один пробел внутри / за пределами тегов.

0 голосов
/ 22 февраля 2012

Самое простое решение, которое я могу придумать, это использовать регулярное выражение для замены всех пробельных символов между угловыми скобками, например так:

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+</, '><')

Это сработало в моем тесте.Кроме того, поскольку угловые скобки недопустимы внутри атрибутов, это не должно влиять на внутреннее содержимое.

Однако это не удаляет лишние пробелы между атрибутами.

0 голосов
/ 22 февраля 2012

Если вы хотите избавиться только от \ t и \ n, вы можете сделать что-то вроде этого:

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

Это, конечно, предполагает, что семантически значимых пробельных символов в качестве значений атрибутов нет.

Это приведет к тому же эффекту, что и ваш пример, но не будет ничего делать для удаления пробелов. Удаление пробелов намного сложнее, так как вам нужен хотя бы один символ пробела между именами атрибутов и тегами, и вы не можете удалить их из значений.

Я не думаю, что есть короткий или элегантный способ сделать это. Вам нужно будет работать с реальным парсером XML. Что-то вроде XMLSlurper было бы хорошим началом.


EDIT

Другая возможность выглядит примерно так:

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

Проблема с этим решением состоит в том, что строка довольно напечатана с новыми строками и отступами, но вы можете объединить первый пример со вторым, чтобы преобразовать красивую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...