1

ファイル内で同じノードが繰り返されている次の XML ファイルを取得しました。たとえば、「console & int」の値/プロパティを取得する必要があります。

/values/property を取得できるように、「console & int」の「config」親を取得する方法はありますか? 「コンソール」と「int」が同じレベルにあるという問題があるため、わかりません:

  1. 「type=console」と「env=int」を同時に照会する方法は?
  2. これらの特定のノードを見つけたら、親を取得する方法は? それで、正しい「構成」親ノードの後に​​「値/プロパティ」を取得できますか?

処理する必要がある XML は次のとおりです。

<server>
  <propertySets>
    <config>
     <type>console</type>
     <env>int</env>
     <values>
         <property name="a">a</property>
         <property name="b">b</property>
     </values>
    </config>

    <config>
     <type>console</type>
     <env>test</env>
     <values>
         <property name="c">c</property>
         <property name="d">d</property>
     </values>
    </config>

    <config>
     <type>embedded</type>
     <env>int</env>
     <values>
         <property name="f">f</property>
         <property name="g">g</property>
     </values>
   </config>
 </propertySets>
</server>
4

1 に答える 1

2

xpath非常に柔軟です。XPath クエリを使用して、必要なことを直接行うことができます。

xml = Nokogiri::XML::Document.parse( File.open('configs.xml' ) )
xml.xpath('/server/propertySets/config[type="console" and env="int"]/values/property[@name="a"]').text

すべてを一度に行う必要はありません。任意の時点でのxpath結果は、そのアクセサーに一致するすべてであるため、次のように選択した構成ブロックを取得できます。

selected_config = xml.xpath('/server/propertySets/config[type="console" and env="int"]')

次に、関心のある値をフェッチします。

property_a_value = selected_config.xpath('values/property[@name="a"]').text

の結果はxpathメイン ドキュメント内のコンテキストを保持するためselected_config、次の兄弟アイテムなどをクエリするために拡張することもできます。

于 2013-03-28T13:16:30.930 に答える