Анализ XML в Groovy должен быть куском пирога, но я всегда сталкиваюсь с проблемами.Анализ XML в Groovy с пространством имен и объектами
Я хотел бы разобрать строку, как это:
<html>
<p>
This is a <span>test</span> with <b>some</b> formattings.<br />
And this has a <ac:special>special</ac:special> formatting.
</p>
</html>
Когда я делаю это стандартный способ new XmlSlurper().parseText(body)
, анализатор жалуется на  
лица. Мое секретное оружие в таких случаях, как это использовать TagSoup:
def parser = new org.ccil.cowan.tagsoup.Parser()
def page = new XmlSlurper(parser).parseText(body)
Но теперь <ac:sepcial>
тег будет закрыт немедленно анализатор - special
текста не будет находиться внутри данного тега, в результате йота. Даже когда я вывожу пространство имен-функции:
def parser = new org.ccil.cowan.tagsoup.Parser()
parser.setFeature(parser.namespacesFeature,false)
def page = new XmlSlurper(parser).parseText(body)
Другой подход заключается в использовании стандартного парсер и добавить доктайп как этот:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Это, кажется, работает для большинства моих файлов, но для анализатора требуется много времени, чтобы получить dtd и обработать его.
Любая хорошая идея, как это решить?
PS: вот некоторые примеры кода, чтобы поиграть с:
@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='0.9.7')
def processNode(node) {
def out = new StringBuilder("")
node.children.each {
if (it instanceof String) {
out << it
} else {
out << "<${it.name()}>${processNode(it)}</${it.name()}>"
}
}
return out.toString()
}
def body = """<html>
<p>
This is a <span>test</span> with <b>some</b> formattings.<br />
And this has a <ac:special>special</ac:special> formatting.
</p>
</html>"""
def parser = new org.ccil.cowan.tagsoup.Parser()
parser.setFeature(parser.namespacesFeature,false)
def page = new XmlSlurper(parser).parseText(body)
def out = new StringBuilder("")
page.childNodes().each {
out << processNode(it)
}
println out.toString()
""
Отлично! Это была версия парсера tagoup, который я использовал (0.9.x) ... 1.2.1 отлично работает для меня. Thanx! – rdmueller