使用tagsoup和Groovy的XmlSlurper时出现奇怪的行为

3
假设我想从类似于以下 XML 字符串中解析电话号码:
str = """ <root> 
            <address>123 New York, NY 10019
                <div class="phone"> (212) 212-0001</div> 
            </address> 
        </root> 
    """
parser = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parseText (str)
println parser.address.div.text()

它没有打印电话号码。

如果我像这样将“div”元素更改为“foo”

str = """ <root> 
            <address>123 New York, NY 10019
                <foo class="phone"> (212) 212-0001</foo> 
            </address> 
        </root> 
    """
parser = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parseText (str)
println parser.address.foo.text()

然后它可以解析并打印电话号码。

到底发生了什么?

顺便说一句,我正在使用groovy 1.7.5和tagsoup 1.2。

3个回答

1

只需更改代码为

println parser.address.'div'.text()

这是Groovy和许多其他动态语言的诅咒 - “div”是保留的方法名称,因此您不会得到节点,而是尝试将“address”节点除以其他内容 :)

你的解释似乎是有道理的,但是你在Groovy控制台中提供的代码建议对我没有起作用。 - user308808
是的,很抱歉没有使用您所拥有的确切配置进行检查。看起来当您使用标准JDK解析器时它可以正常工作,因此问题可能出在TagSoup解析器上。 - oiavorskyi

0

我记得TagSoup会规范化HTML标签,即将它们转换为大写。因此,您想要的GPath表达式可能是:

println parser.ADDRESS.DIV.text()

我发现将解析结果打印出来很方便 - 这样你就可以看到为什么你的 GPath 不起作用了。使用这个方法...

println groovy.xml.XmlUtil.serialize(parser)

0

我知道这个问题很老了。但是最近我也遇到了这个问题,以下是我使用的方法:

parser.'**'.findAll { it.name() == 'div' && it.@class.text() == 'phone' }.each { div ->
    println div.text()
}
  1. 使用深度优先查找所有标签
  2. 按名称过滤 div,该标签具有类 phone
  3. 打印值 (212) 212-0001

Groovy 版本为 2.4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接