0

我有一个试图用 Nokogiri 分析的 XML 文件:

    <?xml version="1.0" encoding="ISO-8859-15"?>
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/icd/001">
  <ehd:header>
    <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/>
    <ehd:service_tmr V="2013-07-01..2013-12-31"/>
  </ehd:header>
  <ehd:body>
    <icd_stammdaten>
      <kapitel_liste>
        <kapitel>
          <nummer V="1"/>
          .......

通常我通过以下方式获得一个节点:

doc = Nokogiri::XML(params[:file])
puts doc.css('nummer')

现在我尝试了:

doc = Nokogiri::XML(params[:file])
puts doc.css('ehd:document_type_cd')

要获得此输出:

<ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/>

但不知何故我没有输出!怎么会这样?

4

2 回答 2

1

处理XML时使用XPATH

当 XML 中有一个命名空间时,下面的技巧Nokogiri::XML::Document#remove_namespaces!会让你的生活变得轻松:

require 'nokogiri'

doc = Nokogiri::XML::Document.parse <<-eot
 <?xml version="1.0" encoding="ISO-8859-15"?>
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/icd/001">
  <ehd:header>
    <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/>
    <ehd:service_tmr V="2013-07-01..2013-12-31"/>
  </ehd:header>
  eot

doc.remove_namespaces!
puts doc.at_xpath('//document_type_cd')
# >> <document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/>

或者,如果您对命名空间XML足够熟悉,请执行以下操作:

require 'nokogiri'

doc = Nokogiri::XML::Document.parse <<-eot
 <?xml version="1.0" encoding="ISO-8859-15"?>
<ehd:ehd ehd_version="1.40" xmlns:ehd="urn:ehd/001" xmlns="urn:ehd/icd/001">
  <ehd:header>
    <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/>
    <ehd:service_tmr V="2013-07-01..2013-12-31"/>
  </ehd:header>
  eot

puts doc.at_xpath('//ehd:document_type_cd','document_type_cd')
# >> <ehd:document_type_cd V="ICD" DN="ICD-Stammdatei" S="1.2.276.0.76.5.100"/>
于 2013-10-06T17:55:41.490 回答
1

Nokogiri教程说

不必使用 XPath 来获得命名空间的好处。也可以使用 CSS 选择器。CSS 只是使用管道符号来指示命名空间搜索。

所以在这种情况下你可以这样做:

puts doc.css('ehd|document_type_cd')

如果您更喜欢使用 CSS 而不是 XPath。

于 2013-10-06T18:11:27.947 回答