Groovy XmlParser теряет индикатор CDATA - PullRequest
0 голосов
/ 30 января 2020

Я использую Groovy метод parseText XmlParser для синтаксического анализа строки XML и возврата объекта (Node obj) для дальнейшей обработки / манипуляции в восходящем направлении. Однако анализ разбирает все оболочки CDATA.

Пример.

import groovy.xml.XmlUtil

String xmlString = """
<stuff>
<people><![CDATA[Person01
Person02
Person03]]></people>
</stuff>
"""

Node xmlParsed = new XmlParser().parseText( xmlString )

print xmlParsed.people

print "\n----\n"

print XmlUtil.serialize( xmlParsed )

Выходы:

[people[attributes={}; value=[Person01
Person02
Person03]]]
----
<?xml version="1.0" encoding="UTF-8"?><stuff>
  <people>Person01
Person02
Person03</people>
</stuff>

Таким образом, вы видите, что CDATA пропал в выводе , Я пробовал это с последними стабильными Groovy (2.5.9) и 3.0.0-r c -3 с одинаковыми результатами.

У меня много стабильного работающего кода вверх по течению с объектом Node, который возвращает XmlParser, так что я надеюсь, что есть что-то еще, что я могу сделать, чтобы сохранить CDATA. В противном случае, у меня есть много хакерских идей, которые наверняка сожрут производительность! ;)

Спасибо за чтение и за любые идеи! :) Эри c

1 Ответ

0 голосов
/ 30 января 2020

XmlParser и XmlSlurper теряют отслеживание секций <![CDATA[ при синтаксическом анализе xml ?

Хотя существует альтернатива, классы Java dom поддерживают CDATA, а Groovy предоставляет Конструктор для анализа элементов из Reader и DOMCategory для навигации в стиле gpath по элементам dom ...

Таким образом, вы можете сделать следующее:

import groovy.xml.DOMBuilder
import groovy.xml.XmlUtil
import groovy.xml.dom.DOMCategory

String xmlString = """
<stuff>
<people><![CDATA[Person01
Person02
Person03]]></people>
</stuff>
"""

def xmlParsed = DOMBuilder.parse(new StringReader(xmlString)).documentElement

use(DOMCategory) {
    println xmlParsed.people.text()
    println '----'
}
print XmlUtil.serialize(xmlParsed)

С поддержкой CDATA :

Person01
Person02
Person03
----
<?xml version="1.0" encoding="UTF-8"?><stuff>

  <people>
    <![CDATA[Person01
Person02
Person03]]>
  </people>

</stuff>
...