【问题标题】:Get the values of attributes with namespace, using Nokogiri使用 Nokogiri 获取具有命名空间的属性值
【发布时间】:2012-01-22 01:25:04
【问题描述】:

我正在使用 Nokogiri 解析一个从 .docx 文件中提取的 document.xml 文件,并且需要获取带有名称的属性值,例如“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

控制台中什么都没有,只有空行。如何获取属性的值?

【问题讨论】:

    标签: ruby xml-parsing nokogiri


    【解决方案1】:

    该文档缺少其命名空间声明,Nokogiri 对此不满意。如果您检查 errorsdoc 方法,您会看到如下内容:

    放 doc.errors 文档上的命名空间前缀 w 未定义 未定义主体上的命名空间前缀 w 未定义 p 上 rsidR 的命名空间前缀 w 未定义 p 上 rsidRPr 的命名空间前缀 w 未定义 p 上 rsidRDefault 的命名空间前缀 w 未定义用于在 p 上剪切的命名空间前缀 pcut p 上的命名空间前缀 w 未定义 pPr 上的命名空间前缀 w 未定义 jc 上 val 的命名空间前缀 w 未定义 jc 上的命名空间前缀 w 未定义 开始和结束标签不匹配:p 第 3 行和正文 开始和结束标签不匹配:正文第 2 行和文档 标记文档第 1 行中的数据过早结束

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

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

    将输出:

    center
    

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

    【讨论】:

    • “文档缺少其命名空间声明”。我是 Nokogiri 的新人,你能告诉我,为什么吗?
    • 我不知道为什么缺少 XML 命名空间。示例 XML 可能不完整或未正确复制。可能 XML 在生成时格式不正确。
    【解决方案2】:
    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

    【讨论】:

      【解决方案3】:

      在那里显示:

      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

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2020-10-03
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多