我对Nokogiri和Ruby很新,并寻求一些帮助。
我使用class MyDoc < Nokogiri::XML::SAX::Document
解析一个非常大的XML文件。现在我想遍历一个街区的内部。
以下是我的XML文件的格式:
<Content id="83087">
<Title></Title>
<PublisherEntity id="1067">eBooksLib</PublisherEntity>
<Publisher>eBooksLib</Publisher>
......
</Content>
我已经知道是否找到了“Content”标签,现在我想知道如何遍历它。这是我缩短的代码:
class MyDoc < Nokogiri::XML::SAX::Document
#check the start element. set flag for each element
def start_element name, attrs = []
if(name == 'Content')
#get the <Title>
#get the <PublisherEntity>
#get the Publisher
end
end
def cdata_block(string)
characters(string)
end
def characters(str)
puts str
end
end
答案 0 :(得分:2)
require 'nokogiri'
require 'xmlsimple'
def isend(node)
return (node.node_type == Nokogiri::XML::Reader::TYPE_END_ELEMENT)
end
reader = Nokogiri::XML::Reader(File.open('database.xml', 'r'))
# traverse the file looking for tag "content"
reader.each do |node|
next if node.name != 'content' || isend(node)
# if we get here, then we found start of node 'content',
# so read it into an array and work with the array:
content = XmlSimple.xml_in(node.outer_xml())
title = content['title'][0]
# ...etc.
end
这对我很有用。有些人可能会反对在相同的代码中混合使用SAX和非SAX(nokogiri和XmlSimple),但就我的目的而言,它可以轻松完成工作。
答案 1 :(得分:0)
使用SAX比较棘手。我认为解决方案需要看起来像这样:
class MyDoc < Nokogiri::XML::SAX::Document
def start_element name, attrs = []
@inside_content = true if name == 'Content'
@current_element = name
end
def end_element name
@inside_content = false if name == 'Content'
@current_element = nil
end
def characters str
puts "#{@current_element} - #{str}" if @inside_content && %w{Title PublisherEntity Publisher}.include?(@current_element)
end
end