我有这个xml:
<kapitel>
<nummer V="1"/>
<von_icd_code V="A00"/>
<bis_icd_code V="B99"/>
<bezeichnung V="Bestimmte infektiöse und parasitäre Krankheiten"/>
<gruppen_liste>
<gruppe>
<von_icd_code V="A00"/>
<bis_icd_code V="A09"/>
<bezeichnung V="Infektiöse Darmkrankheiten"/>
<diagnosen_liste>
<diagnose>
<icd_code V="A00.-"/>
<bezeichnung V="Cholera"/>
<abrechenbar V="n"/>
<krankheit_in_mitteleuropa_sehr_selten V="j"/>
<schlüsselnummer_mit_inhalt_belegt V="j"/>
<infektionsschutzgesetz_meldepflicht V="j"/>
<infektionsschutzgesetz_abrechnungsbesonderheit V="j"/>
如何查看我的第一个节点是kapitel。我想做一些类似于kapitel的事情。每个都做|f|,这样nokgiri就可以按正确的顺序提取节点von_id_code和bis_id_code。我的代码:
require 'rubygems'
require 'nokogiri'
require 'open-uri'
@doc = Nokogiri::XML(File.open("icd.xml"))
kapitel = @doc.css('kapitel')
kapitel.each do |f|
puts f.css('von_icd_code')
puts f.css('bis_icd_code')
end
问题是,nogiri没有在正确的顺序中提取"von_icd_code"one_answers"bis_icd_cod",而是首先列出所有von_icd-code,然后列出所有"bis_icd _code"。如何提取正确顺序中的节点?
在我的输出中,我得到:
<von_icd_code V="A00"/>
在这种情况下,我如何才能只获得V的内容A00
谢谢!
您可以使用Nokogiri的traverse
方法,该方法以递归方式遍历所有XML节点。
您的示例将类似于以下内容:
names = %w(von_icd_code bis_icd_code)
@doc.traverse {|node| p node['V'] if names.include? node.name}
它打印出
"A00"
"B99"
"A00"
"A09"
Nokogiri::Node
中有很多巧妙的东西,使我们能够对最复杂的XML文件进行非常酷的处理。想要一份简短的清单,你可以看看这份备忘单。
祝你好运!
由于bis_icd_code
跟在每个von_icd_code
后面,因此显而易见的选择是css的+
下一个相邻的同级选择器:
doc.css('von_icd_code').each do |icd|
puts icd['V']
puts icd.at('+ bis_icd_code')['V']
end
#=> A00
#=> B99
#=> A00
#=> A09
更新
很抱歉,这不适用于CSS选择器。请改用XPath。至于您的第二个问题,节点node
的属性V
可以使用node['V']
在Nokogiri中访问。像这个
kapitel = @doc.xpath('//kapitel')
kapitel.each do |f|
f.xpath('//von_icd_code | //bis_icd_code').each do |node|
puts node['V']
end
end
输出
A00
B99
A00
A09
你可以通过写来解决这个问题,而不需要traverse
的奢侈
kapitel.each do |f|
puts f.css('von_icd_code, bis_icd_code')
end