我有一个XML文件,我正在尝试用Nokogiri进行分析:
<?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"/>
但不知怎的,我没有输出!怎么会这样?
答案 0 :(得分: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"/>
答案 1 :(得分:1)
您不必须使用XPath来获取命名空间的好处。也可以使用CSS选择器。 CSS只使用管道符号来表示命名空间搜索。
所以在这种情况下你可以这样做:
puts doc.css('ehd|document_type_cd')
如果您更喜欢使用CSS而不是XPath。