2012-01-05 19 views
1

私はいくつかのXMLファイルを解析して操作するRubyスクリプトに取り組んでいます。私はXML処理のためにNokogiriを使用しています。私は特定の<VALUE>ATTRIBUEnn</VALUE>の同じ範囲内だ<VALUE>タグを設定する必要が兄弟タグの内容を参照して、CSSセレクタを介してタグを検索するにはどうすればよいですか?

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

私が持っている問題は、このようないくつかの構成要素があるということです。私の現在のアプローチは、使用しています

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

しかし、それはかなり醜いです。

状況をよりきれいに処理するにはどうすればいいですか?

+1

それはCSSでなければなりませんか? XPathが良い選択かもしれません。 –

+0

私は既に他の回答のスレッドで答えたので、CSSの選択は一貫性のためです。アプリケーション全体はCSSセレクタに依存しているので、私はそれに固執するつもりです。 – cassianoleal

答えて

2

CSSセレクタのVALUE要素を見つけます〜のための兄弟です〜:

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

これは完璧に動作します、ありがとう。 – cassianoleal

+0

ちょうど追加するには、@Phrogzの答えも動作します。これを正しいものとしてマークしているのは、前者がXPathを使用しているのに対し、CSSを使用しているからです。私はXPathに問題はありませんが、アプリケーション全体がCSSロケータを使用して書かれているので、一貫性を保つためにそれに固執したいと思います。 – cassianoleal

0

鋸山はCSS3をサポートしている場合、私は知らないが、それがない場合、これはXPathの使用

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

CSS3はサポートしていますが、明らかにある程度までサポートされています。 'content'はサポートされていませんが、' text'については不平を言っていませんでした。問題は単純に 'text'フィルタを無視して、すべての' 'ノードをダンプしたということです... – cassianoleal

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> 

を:

  • //USER_ELEMENT - 文書内の任意の場所にこの名前の要素を見つける
  • […] - だけならば...
    • NAME="ATTRIBUTE01" - ...あなたはこのテキスト
  • /VALUEと子NAME要素を見つけることができます - そして今、子供にこれら
+0

私は、すぐにあなたにもう一つの素早いXPathレッスンを与えることを考えました。私が心に持っていたもの。 –

+0

答えをありがとう。 CSSよりも少しクリーンですが、私が言ったように、このプロジェクトではCSSを一貫性を保ちたいと思っています。 – cassianoleal

関連する問題