我正在研究一个可以解析和操作某些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'
但它看起来很丑陋。
我想知道哪种方式可以更清晰地处理这种情况?
答案 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"