Выберите атрибут из узла с XPath - PullRequest
2 голосов
/ 20 июля 2010

У меня есть файл со следующей структурой

<admin>
 <sampleName>Willow oak leaf</sampleName>
 <sampleDescription comment="Total genes">
  <cvParam cvLabel="Bob" accession="123" name="Oak" />      
 </sampleDescription> 
</admin>

Я пытаюсь получить текст «Всего генов» после комментария sampleDescription, и я использовал следующий код:

sampleDescription = doc.xpath( "/admin/Description/@comment" )
sampleDescription = doc.xpath( "/admin/Description" ).text

Но ни одна из них не работает.Чего мне не хватает?

Ответы [ 4 ]

1 голос
/ 20 июля 2010

Это не работает, потому что нет элемента Description.Как упомянул Iwe, вам нужно сделать что-то вроде sampleDescription = doc.xpath("/admin/sampleDescription/@comment").to_s

Кроме того, если бы это был я, я бы просто сделал sampleDescription = doc.xpath("//sampleDescription/@comment").to_s.Это более простой xpath, но он может быть медленнее.

И, как примечание, кое-что, что сбивает с толку многих людей, - это пространства имен.Если ваш XML-документ использует пространства имен, выполните sampleDescription = doc.xpath("/xmlns:admin/sampleDescription/@comment").to_s.Если в вашем документе используются пространства имен и вы не указали его с помощью xmlns:, то Nokogiri ничего не вернет.

1 голос
/ 20 июля 2010

Попробуйте это:

doc.xpath("//admin/sampleDescription/@comment").to_s
1 голос
/ 20 июля 2010

может быть опечатка ... вы пробовали doc.xpath("/admin/sampleDescription/@comment").text?

0 голосов
/ 20 июля 2010

doc.xpath возвращает NodeSet, который действует немного как массив.Таким образом, вам нужно получить первый элемент

doc.xpath("//admin/sampleDescription").first['comment']

Вы также можете использовать at_xpath, что эквивалентно xpath(foo).first

doc.at_xpath("//admin/sampleDescription")['comment']

Еще одна вещь, которую следует отметить, это то, что атрибуты на узлахдоступ к ним как к хеш-элементам - с [<key>]

...