需要帮助更改Ruby Ox Sax XML解析器以使用CDATA

时间:2014-07-13 14:41:07

标签: ruby-on-rails ruby xml sax cdata

我找到了一个关于如何用Ox和Sax解析XML的好例子(https://gist.github.com/danneu/3977120)。现在我尝试使用我自己的使用CDATA字段的XML文件。

这是我发现的例子:

require "ox"
require "open-uri"

class Handler < Ox::Sax
  USER_ATTR = [:userid, :username, :email]
  ATTR_MAP = { userid: :as_i, username: :as_s, email: :as_s}

  def start_element(name)
    @user = {} if name == :row
    @current_node = name
  end

  def value(value)
    return unless USER_ATTR.include?(@current_node)
    @user[@current_node] = value.send(ATTR_MAP[@current_node])
  end

  def end_element(name)
    return unless name == :row
    puts @user[:userid], @user[:username], @user[:email]
  end
end

handler = Handler.new
File.open("user.xml") do |f|
  Ox.sax_parse(handler, f)
end

适用于此类XML文件:

<!-- 80mb file, 38,000 row nodes -->
<?xml version="1.0"?>
<data>
  <users>
    <row>
      <userid>1</userid>
      <username>danneu</username>
      <email>danrodneu@gmail.com</email>
      <dozens>etc.</dozens>
      <more>etc.</more>
      <nodes>etc.</nodes>
    </row>
    <row>
      <userid>2</userid>
      ...
    </row>
    ...
  </users>
</data>

现在我想让它适用于这种类型的XML文件:

<!-- 80mb file, 38,000 row nodes -->
<?xml version="1.0"?>
<data>
  <users>
    <row>
      <userid><![CDATA[1]]></userid>
      <username><![CDATA[danneu]]></username>
      <email><![CDATA[danrodneu@gmail.com]]></email>
      <dozens><![CDATA[etc.]]></dozens>
      <more><![CDATA[etc.]]></more>
      <nodes><![CDATA[etc.]]></nodes>
    </row>
    <row>
      <userid><![CDATA[2]]></userid>
      ...
    </row>
    ...
  </users>
</data>

任何人都知道如何使其与CDATA字段一起使用?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用cdata方法代替值方法。像这样:

def cdata(str)
    # do something with str here
end

有关不同的方法,请参阅doc