【问题标题】:How to parse strange XML file with Nokogiri?如何用 Nokogiri 解析奇怪的 XML 文件?
【发布时间】:2013-03-30 07:44:08
【问题描述】:

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

知道如何检索 'console & int' 的 'config' 父级,以便在获取 /values/property 之后获得?我遇到的问题是 'console' 和 '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>

【问题讨论】:

  • 有根节点吗?否则它不是格式良好的 XML 文档,这使问题变得更加困难
  • 刚刚检查过,是的,这些节点在“服务器> propertySets”下。我修改了帖子中的 XML 以显示整个结构...

标签: ruby nokogiri


【解决方案1】:

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 向上扩展以查询下一个同级项等。

【讨论】:

  • 很好,非常感谢尼尔!!!我不知道你可以做这个... type="console" 和 env="int"。谢谢你的解释!
  • searchxpathcss 的结果视为指向DOM 中节点的指针数组或双链表。这就是为什么它们能够被用来在层次结构中上下查找,以及为什么我们能够分离它们并移动它们并且它们的children 与它们一起移动。
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多