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 に答える