Синтаксический анализ XML в Groovy strip приписывает новые строки - PullRequest
1 голос
/ 30 апреля 2010

Я пишу код, где я получаю XML из веб-API, а затем анализирую этот XML с помощью Groovy.К сожалению, кажется, что и XmlParser, и XmlSlurper для Groovy удаляют символы новой строки из атрибутов узлов при вызове .text ().

Как получить текст атрибута , включая символы новой строки?

Пример кода:

def xmltest = '''
<snippet>
   <preSnippet att1="testatt1" code="This is line 1
   This is line 2
   This is line 3" >
      <lines count="10" />
   </preSnippet>
</snippet>'''

def parsed = new XmlParser().parseText( xmltest )
println "Parsed"
parsed.preSnippet.each { pre ->
       println pre.attribute('code');
}


def slurped = new XmlSlurper().parseText( xmltest )
println "Slurped"
slurped.children().each { preSnip ->
   println preSnip.@code.text()
   }

, вывод которого:

Parsed
This is line 1    This is line 2    This is line 3
Slurped
This is line 1    This is line 2    This is line 3

Хорошо, я смог преобразовать текст, прежде чем проанализировал его,затем преобразовать после, а-ля:

def newxml = xmltest.replaceAll( /code="[^"]*/ ) {
   return it.replaceAll( /\n/, "~#~" )
}
def parsed = new XmlParser().parseText( xmltest )
def code = pre.attribute('code').replaceAll( "~#~", "\n" )

Не мой любимый хак, но он будет работать, пока они не исправят свои выходные данные XML.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2010

Новые строки не поддерживаются в атрибутах - это из спецификации XML. В итоге они «нормализуются», что в данном случае означает, что они заменяются пробелом. Смотрите этот раздел спецификации: http://www.w3.org/TR/REC-xml/#AVNormalize

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

0 голосов
/ 26 февраля 2013

Я думаю, что вы неправильно читаете спецификацию XML. Новые строки допускаются в значениях атрибутов, но если объявленное значение атрибута относится к одному из типов токенов, то пробел нормализуется.

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