解析Groovy中的XML应该是一件小事,但我总是遇到问题。使用命名空间和实体解析Groovy中的XML
我想解析字符串是这样的:
<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
文本将不会在导致DOM在此标签内。甚至当我禁用命名空间功能:
def parser = new org.ccil.cowan.tagsoup.Parser()
parser.setFeature(parser.namespacesFeature,false)
def page = new XmlSlurper(parser).parseText(body)
另一种方法是使用标准的解析器和添加的doctype像这样的:
<!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()
""
太棒了!它是我使用的tagsoup解析器的版本(0.9.x)... 1.2.1适合我。感谢名单! – rdmueller