我有几个大的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。
发布于 2013-07-03 09:09:41
Nokogiri将接受多个表达式,例如:
doc.search('Listing', 'property').each do |item|
puts item.at('StreetAddress', 'othernameforaddress').text
end不过,文件大小问题可能是一个更大的问题。如果您没有足够的内存,可以研究一下SAX
发布于 2013-07-03 06:32:04
我会使用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"]https://stackoverflow.com/questions/17435426
复制相似问题