1

私はいくつかのXMLファイルを解析して操作するRubyスクリプトに取り組んでいます。XMLの処理にはNokogiriを使用しています。

私が抱えている問題は、このような構造がいくつかあることです。

<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 に答える