如何用Nokogiri解析奇怪的XML文件?

时间:2013-03-28 12:33:19

标签: ruby nokogiri

我有以下XML文件,其中相同的节点在文件中重复,我需要获取'console&的值/属性。例如,int'。

知道如何检索'console&的'config'父级int'以便我可以在获取/ values / property之后?我遇到的问题是'console'和'int'处于同一级别,所以我不知道:

  1. 如何同时查询'type = console'和'env = int'?
  2. 一旦找到那些特定节点,如何获取父节点?那么可以在正确的'config'父节点之后检索'values / property'吗?
  3. 我们需要使用的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 个答案:

答案 0 :(得分: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向后扩展以查询下一个兄弟项目等。

相关问题