我正在开发一个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"