使用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

控制台中没有任何内容,只有空行。我怎样才能得到属性的值?

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

应该工作。不要忘记查看文档:http://nokogiri.org/tutorials/searching_a_xml_html_document.html#fn:1

文档缺少名称空间声明,Nokogiri对此不满意。如果检查docerrors方法,您将看到如下内容:

<>之前把doc.errors文档上没有定义命名空间前缀名称空间前缀没有定义未定义p上的rsidR的命名空间前缀w未定义rsidRPr在p上的名称空间前缀w没有定义p上rsidRDefault的命名空间前缀w命名空间前缀pcut没有定义没有定义命名空间前缀w未定义pPr上的命名空间前缀w没有定义jc上val的命名空间前缀w未定义jc上的命名空间前缀w开始和结束标签不匹配:p第3行和正文开始和结束标签不匹配:正文第2行和文档标记文档第1行数据过早结束之前

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

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

将输出:

center

如果您需要遍历多个jc节点,请使用search或其别名之一或类似行为的方法,类似于您之前所做的。

Show there:

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

相关内容

  • 没有找到相关文章

最新更新