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を見て、それが であることを確認/し、そのパスが絶対パスであると見なします (で始まるパスは絶対パスであるため/)。

おそらく、.beforeを使用してパスを強制的に相対パスにすることができるので、パーサーは?と//混同//しません。/

つまり、"//c"使用する代わりに".//c"? お役に立てれば。

于 2013-05-15T12:33:57.227 に答える