如何使用包含不同标记的Ruby解析巨大的XML文件



我有几个大的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>

不同风格之间的主要区别在于,一个具有<Listing>节点,另一个称其为<property/>。子元素的嵌套也各不相同。

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

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

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

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

不过,文件大小问题可能是一个更大的问题。如果内存不足,可以查看SAX

我会选择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"]

相关内容

  • 没有找到相关文章

最新更新