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')

XPath よりも CSS を使用したい場合。

于 2013-10-06T18:11:27.947 に答える