首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用包含不同标签的Ruby解析巨大的XML文件?

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

Stack Overflow用户
提问于 2013-07-03 04:37:42
回答 2查看 302关注 0票数 1

我有几个大的XML文件,如下所示:

代码语言:javascript
复制
<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。

EN

回答 2

Stack Overflow用户

发布于 2013-07-03 09:09:41

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

代码语言:javascript
复制
doc.search('Listing', 'property').each do |item|
  puts item.at('StreetAddress', 'othernameforaddress').text
end

不过,文件大小问题可能是一个更大的问题。如果您没有足够的内存,可以研究一下SAX

票数 2
EN

Stack Overflow用户

发布于 2013-07-03 06:32:04

我会使用Nokogiri或REXML和XPath,如下所示:

代码语言:javascript
复制
//*[self::Listing or self::property]

因此,使用Nokogiri的代码将如下所示:

代码语言:javascript
复制
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"]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17435426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档