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 和 tagoup 1.2

4

3 回答 3

1

只需将代码更改为

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

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

于 2011-02-01T20:24:57.863 回答
0

我似乎记得 tagoup 规范化 HTML 标签 - 即它大写它们。所以你想要的 GPath 表达式可能是

println parser.ADDRESS.DIV.text()

我发现能够打印出解析的结果很方便——然后你就可以看到为什么你的 GPath 不工作了。用这个..

println groovy.xml.XmlUtil.serialize(parser)
于 2011-08-01T13:15:28.520 回答
0

我知道这个问题很老了。但我最近遇到过,这就是我使用的:

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

Groovy 版本是 2.4

于 2016-07-22T12:46:54.617 回答