如何通过CSS选择器定位标记,引用同级标记的内容



我正在开发一个Ruby脚本,该脚本将解析和操作一些XML文件。我使用Nokogiri来处理XML。

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

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

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

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

但它看起来相当难看。

我想知道哪种处理这种情况的方式更干净?

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

同级的css选择器是~:

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

我不知道nokogiri是否支持CSS3,但如果支持,这应该能在中工作

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

相关内容

  • 没有找到相关文章

最新更新