1

给定xml

<a>
    <b key=1>
        <c value=xxx />
    </b>
    <b key=2>
        <c value=yyy />
    </b>
</a>

目标:首先获取每个“b”,然后获取该“b”下的“c”,如下面的结果。使用 XPath 搜索孩子。

for <b key=1>
    <c value=xxx />
for <b key=2>
    <c value=xxx />

但下面的代码

b_elements = XPath.match(xml, "//b[@key]")
b_elements.each do |b_element|
    puts b_element.elements["//c"]
end

将导致屈服

for <b key=1>
    <c value=xxx />
    <c value=yyy />
for <b key=2>
    <c value=xxx />
    <c value=yyy />

而不是只在每个“b”下获得“c”

我试过下面的方法但没有运气,似乎如果使用Xpath,它会自动从根元素搜索

b.get_elements("//c")
XPath.first(b, "//c")

我现在的解决方法是一次遍历 1 层子元素并搜索所需的键,与使用 XPath 相比,这似乎很愚蠢。请指教,谢谢:)

参考: http ://ruby-doc.org/stdlib-1.9.3/libdoc/rexml/rdoc/REXML/Element.html#method-i-each_element_with_attribute

4

1 回答 1

1

这里不确定,但我的假设是 XPath 查看第一个 char,认为它是 a /,并认为路径是绝对的(因为以开头的路径/是绝对的)。

可能您可以通过使用.before强制路径是相对的//,因此解析器不会混淆//for /?

我的意思是,而不是"//c"使用".//c"?希望这可以帮助。

于 2013-05-15T12:33:57.227 回答