gpt4 book ai didi

ruby - 萨克斯用 nokogiri 解析奇怪的元素

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:03 25 4
gpt4 key购买 nike

我想在 nokogiri 中进行 sax 解析,但是当涉及到解析具有长而疯狂的 xml 元素名称或属性的 xml 元素时......然后一切都变得疯狂。

如果我想解析这个 xml 文件并获取所有标题元素,我该如何使用 nokogiri-sax 来实现。

<titles>
<title xml:lang="sv">Arkivvetenskap</title>
<title xml:lang="en">Archival science</title>
</titles>

最佳答案

在您的示例中,title 是元素的名称。 xml:lang="sv" 是一个属性。此解析器假定没有元素嵌套在 title 元素中

require 'rubygems'
require 'nokogiri'

class MyDocument < Nokogiri::XML::SAX::Document
def start_element(name, attrs)
@attrs = attrs
@content = ''
end
def end_element(name)
if name == 'title'
puts Hash[@attrs]['xml:lang']
puts @content.inspect
@content = nil
end
end
def characters(string)
@content << string if @content
end
def cdata_block(string)
characters(string)
end
end

parser = Nokogiri::XML::SAX::Parser.new(MyDocument.new)
parser.parse(DATA)

__END__
<titles>
<title xml:lang="sv">Arkivvetenskap</title>
<title xml:lang="en">Archival science</title>
</titles>

这打印

sv
"Arkivvetenskap"
en
"Archival science"

SAX 解析通常过于复杂。因此,我推荐 Nokogiri 的标准内存解析器,或者如果您真的需要速度和内存效率,Nokogiri's Reader parser .

为了比较,这里有一个用于同一文档的标准 Nokogiri 解析器

require 'rubygems'
require 'nokogiri'

doc = Nokogiri::XML(DATA)
doc.css('title').each do |title|
puts title['lang']
puts title.text.to_s.inspect
end

__END__
<titles>
<title xml:lang="sv">Arkivvetenskap</title>
<title xml:lang="en">Archival science</title>
</titles>

这是同一文档的阅读器解析器

require 'rubygems'
require 'nokogiri'

reader = Nokogiri::XML::Reader(DATA)
while reader.read
if reader.name == 'title' && reader.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
puts reader.attribute('xml:lang')
puts reader.inner_xml.inspect # TODO xml decode this, if necessary.
end
end

__END__
<titles>
<title xml:lang="sv">Arkivvetenskap</title>
<title xml:lang="en">Archival science</title>
</titles>

关于ruby - 萨克斯用 nokogiri 解析奇怪的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9984621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com