1

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

4

2 回答 2

2

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

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

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

于 2013-07-03T01:09:41.010 回答
0

我会像这样使用 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"]
于 2013-07-02T22:32:04.027 回答