我找到了一个关于如何用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字段一起使用?
提前致谢。
答案 0 :(得分:1)