使用Nokogiri获取带有命名空间的属性值

时间:2011-12-16 14:23:26

标签: ruby xml-parsing nokogiri

我正在使用Nokogiri解析document.xml文件,从.docx文件中提取并需要获取具有名称的属性值,例如“w:val”。

这是源XML的示例:

<w:document>
  <w:body>
    <w:p w:rsidR="004D5F21" w:rsidRPr="00820E0B" w:rsidRDefault="00301D39" pcut:cut="true">
      <w:pPr>
        <w:jc w:val="center"/>
      </w:pPr>
  </w:body>
</w:document>

这是代码示例:

require 'nokogiri' 

doc = Nokogiri::XML(File.open(path))
  doc.search('//w:jc').each do |n|
    puts n['//w:val']
  end

控制台中没有任何内容,只有空行。如何获取属性的值?

3 个答案:

答案 0 :(得分:3)

require 'nokogiri' 

doc = Nokogiri::XML(File.open(path))
  doc.xpath('//jc').each do |n|
    puts n.attr('val')
  end

应该有效。不要忘记查看文档:{​​{3}}

答案 1 :(得分:3)

该文档缺少其名称空间声明,Nokogiri对此不满意。如果您检查errors的{​​{1}}方法,则会看到以下内容:

puts doc.errors
Namespace prefix w on document is not defined
Namespace prefix w on body is not defined
Namespace prefix w for rsidR on p is not defined
Namespace prefix w for rsidRPr on p is not defined
Namespace prefix w for rsidRDefault on p is not defined
Namespace prefix pcut for cut on p is not defined
Namespace prefix w on p is not defined
Namespace prefix w on pPr is not defined
Namespace prefix w for val on jc is not defined
Namespace prefix w on jc is not defined
Opening and ending tag mismatch: p line 3 and body
Opening and ending tag mismatch: body line 2 and document
Premature end of data in tag document line 1

通过使用Nokogiri的CSS访问器而不是XPath,您可以绕过名称空间问题:

doc

将输出:

puts doc.at('jc')['val']

如果您需要迭代多个center 节点,请使用jc或其中一个别名或类似行为的方法,类似于之前的操作。

答案 2 :(得分:0)

显示那里:

require 'nokogiri' 

doc = Nokogiri::XML(File.open(path))
  doc.search('jc').each do |n|
  puts n['val']
end

另外,是的,请阅读:http://nokogiri.org/tutorials/searching_a_xml_html_document.html#fn:1