Как я могу найти тег с помощью селекторов CSS, ссылаясь на содержимое одноуровневого тега? - PullRequest
1 голос
/ 06 января 2012

Я работаю над сценарием Ruby, который будет анализировать и манипулировать некоторыми файлами XML.Я использую Nokogiri для обработки XML.

Проблема, с которой я столкнулся, состоит в том, что есть несколько таких конструкций:то же самое из конкретного <VALUE>ATTRIBUEnn</VALUE>.Мой нынешний подход использует

xml.css('USER_ELEMENT').find { |node| node.at_css('NAME').text == 'ATTRIBUTEnn'}.at_css('VALUE').content = 'NEW_VALUE'

, но выглядит довольно некрасиво.

Мне интересно, какой из этих способов был бы более чистым?

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Использование XPath:

attnn = "ATTRIBUTE01"
xml.at_xpath("//USER_ELEMENT[NAME='#{attnn}']/VALUE").content = "Yay"
puts xml
#=> <USER_ELEMENT>
#=>   <NAME>ATTRIBUTE01</NAME>
#=>   <VALUE>Yay</VALUE>
#=> </USER_ELEMENT>

На английском языке XPath говорит:

  • //USER_ELEMENT - найти элементы с этим именем в любом месте документа
  • […] - но только если…
    • NAME="ATTRIBUTE01" -… вы можете найти дочерний элемент NAME с этим текстом
  • /VALUE - и теперь найтиребенок VALUE элементы этих
2 голосов
/ 06 января 2012

Селектор css для братьев и сестер ~:

xml.at('USER_ELEMENT > NAME[text()="ATTRIBUTE01"] ~ VALUE').content = 'NEW_VALUE'
0 голосов
/ 06 января 2012

Я не знаю, поддерживает ли nokogiri CSS3, но если это так, это должно сработать

xml.css('USER_ELEMENT NAME:content("ATTRIBUTEnn") + VALUE').content = "NEW_VALUE"
...