如何通过CSS选择器定位标签,引用兄弟标签的内容?

时间:2012-01-05 20:54:42

标签: css ruby xml nokogiri siblings

我正在研究一个可以解析和操作某些XML文件的Ruby脚本。我正在使用Nokogiri进行XML处理。

我遇到的问题是有几个这样的结构:

<USER_ELEMENT>
  <NAME>ATTRIBUTE01</NAME>
  <VALUE>XXX</VALUE>
</USER_ELEMENT>

我需要设置与<VALUE>相同的<VALUE>ATTRIBUEnn</VALUE>标记。我目前的方法是使用

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

但它看起来很丑陋。

我想知道哪种方式可以更清晰地处理这种情况?

3 个答案:

答案 0 :(得分:3)

使用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元素

答案 1 :(得分:2)

兄弟姐妹的css选择器是〜:

xml.at('USER_ELEMENT > NAME[text()="ATTRIBUTE01"] ~ VALUE').content = 'NEW_VALUE'

答案 2 :(得分:0)

我不知道nokogiri是否支持CSS3,但如果确实如此,这应该可行

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