2013-05-15 1 views
1

Учитывая XMLRuby: Как найти элемент дочернего элемента XML из определенного элемента с помощью xpath?

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

Цель: Получить каждый «б», а затем получить «с» при этом «Ъ», как результат ниже. С 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 

приведет к yeilding

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

вместо того, чтобы просто получать "с" каждого "б"

Я попытался ниже метод но не повезло, кажется, что , если использовать 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

ответ

1

Не уверен, что здесь, но мое предположение, что XPath смотрит на первого символа, видит, что это /, и думает, что путь абсолютный (поскольку путь, начинающийся с /, должен быть абсолютным).

Вероятно, вы можете заставить путь быть относительным путем использования . перед //, так что синтаксический анализатор не перепутать // для /?

Я имею в виду, вместо "//c"".//c"? Надеюсь это поможет.

+0

он работает при помощи ".//c", спасибо –