【问题标题】:How do I parse huge XML files with Ruby containing different tags?如何使用包含不同标签的 Ruby 解析巨大的 XML 文件?
【发布时间】:2013-06-30 09:38:00
【问题描述】:

我有几个大的 XML 文件,像这样:

<Listings>
  <Listing>
    <Location>
      <StreetAddress>123 Main St</StreetAddress>
      <UnitNumber>2F</UnitNumber>
      <City>Anytown</City>
      <State>NY</State>
      <Zip>10000</Zip>
    </Location>
  </Listing>
  <!-- a bajillion more Listing nodes -->
</Listings>

不同风味之间的主要区别在于,一种具有&lt;Listing&gt; 节点,另一种称为&lt;property/&gt;。子元素的嵌套也各不相同。

什么是解析一系列大 XML 文件的好方法,每个文件都包含相似的条目但具有不同的标签名称?我认为维护标签名称的映射表是有道理的,但是如何使用 Ruby 有效地遍历这些名称?

我想获取&lt;Listing&gt; 元素,解析出它们的子元素,如StreetAddress 等,然后将它们写在其他地方。每个文件都包含数千个列表,有些是 100+MB。

【问题讨论】:

标签: ruby xml nokogiri sax


【解决方案1】:

Nokogiri 将接受多个表达式,例如:

doc.search('Listing', 'property').each do |item|
  puts item.at('StreetAddress', 'othernameforaddress').text
end

文件大小问题可能是一个更大的问题。如果你没有足够的内存,你可以看看 SAX

【讨论】:

  • CSS 也允许使用search('Listing, property'),其中选择器都在一个字符串中。
【解决方案2】:

我会像这样使用 Nokogiri 或 REXML 和 XPath:

//*[self::Listing or self::property]

所以使用 Nokogiri 的代码将是这样的:

require "nokogiri"

doc = Nokogiri.XML <<-XML
  <Listings>
    <Listing>
      <Location>
        <StreetAddress>123 Main St</StreetAddress>
        <UnitNumber>2F</UnitNumber>
        <City>Anytown</City>
        <State>NY</State>
        <Zip>10000</Zip>
      </Location>
    </Listing>
    <property>
      <Location>
        <StreetAddress>321 Main St</StreetAddress>
        <UnitNumber>2F</UnitNumber>
        <City>Anytown</City>
        <State>NY</State>
        <Zip>10000</Zip>
      </Location>
    </property>
  </Listings>
XML

doc.xpath("//*[self::Location or self::property]").map do |node|
  node.xpath("./*[self::StreetAddress or self::AlternativeStreetAddress]").text
end

# => ["123 Main St", "321 Main St"]

【讨论】:

猜你喜欢
  • 2019-12-09
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多