2013-03-28 63 views
1

我已經得到了以下XML文件,其中相同的節點在文件中重複,並且我需要獲取'console & int'的值/屬性。如何解析與Nokogiri奇怪的XML文件?

任何想法如何我可以檢索'控制檯& int'的'配置'父母,以便我可以在get/values/property之後?我遇到的問題,即「控制檯」和「INT」都在同一水平,所以我不知道:

  1. 如何查詢「類型=控制檯」和「ENV = INT」同步?
  2. 如何讓父母找到那些特定的節點?那麼可以在正確的'config'父節點之後檢索'values/property'?

,我們需要一起工作的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> 
+1

是否有根節點?這不是一個格式良好的XML文檔,否則會導致問題更難 –

+0

剛剛檢查,是的,這些節點在'server> propertySets'下。我在帖子中修改了XML以顯示整個結構... – mickael

回答

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延伸回查詢下一個兄弟項目等。

+0

不錯,非常感謝尼爾!我不知道你可以做這個... type =「console」和env =「int」。感謝您的解釋! – mickael

+0

將'search','xpath'和'css'的結果想象成指針數組或雙鏈表列表到DOM中的節點。這就是爲什麼他們能夠用來在層次結構中上下查看,以及爲什麼我們能夠將它們分離並移動,並且他們的「孩子」隨着它們移動。 –