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