1

我正在研究一个 Ruby 脚本,它将解析和操作一些 XML 文件。我正在使用 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'

但它看起来相当丑陋。

我想知道处理这种情况的更清洁的方法是什么?

4

3 回答 3

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元素
于 2012-01-05T22:33:32.527 回答
2

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

xml.at('USER_ELEMENT > NAME[text()="ATTRIBUTE01"] ~ VALUE').content = 'NEW_VALUE'
于 2012-01-05T23:46:21.123 回答
0

我不知道 nokogiri 是否支持 CSS3,但如果支持,这应该可以

xml.css('USER_ELEMENT NAME:content("ATTRIBUTEnn") + VALUE').content = "NEW_VALUE"
于 2012-01-05T21:05:15.207 回答