7

我有这个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 .each do |f|的事情 以便 nokgiri 以正确的顺序提取节点 von_icd_code 和 bis_icd_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”和“bis_icd_code”,而是首先列出所有 von_icd_code,然后列出所有“bis_icd_code”。我怎样才能以正确的顺序提取节点?

在我的输出中我得到:

<von_icd_code V="A00"/>

在这种情况下我怎样才能得到 V 的内容A00

谢谢!

4

3 回答 3

8

您可以使用 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 文件做一些非常酷的事情。有关它们的简短列表,您可以查看此备忘单

祝你好运!

于 2013-08-10T08:47:12.897 回答
5

由于bis_icd_code跟随 each 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
于 2013-08-10T11:54:28.427 回答
2

更新

对不起,这不适用于 CSS 选择器。请改用 XPath。至于您的第二个问题,可以使用 Nokogiri 访问V节点的属性。像这样nodenode['V']

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
于 2013-08-10T10:40:29.620 回答