如何匹配Nokogiri的所有命名空间元素

时间:2017-02-10 04:36:15

标签: ruby namespaces nokogiri

我想找到这样的元素。

xml1 = '<period>2017-02-10</period>'

xml2 = <<XML
<root xmlns:xbrli="http://www.w3.org/1999/xhtml">
  <xbrli:period>2017-02-10</period>
</root>
XML

我可以通过以下方式选择元素:

  def period_from_xml(xml)
    doc = Nokogiri::XML(xml)
    period_element = if doc.namespaces.keys.include?('xmlns:xbrli')
      doc.at_css("xbrli|period")
    else
      doc.at_css("period")
    end
  end

  period_from_xml(xml1)
  # => <period>2017-02-10</period>
  period_from_xml(xml2)
  # => <xbrli:period>2017-02-10</period>

我知道Nokogiri::XML::Document#remove_namespaces!,但我不想使用它,因为我需要它的另一个地方。

也许复制docdoc_without_namespaces是个好主意?

有一种简单易行的方法来处理这种情况吗?

1 个答案:

答案 0 :(得分:0)

我会用这个:

require 'nokogiri'

xml = <<EOT
<root xmlns:xbrli="http://www.w3.org/1999/xhtml">
  <period>2017-02-10</period>
  <xbrli:period>2017-02-11</period>
</root>
EOT

doc = Nokogiri::XML(xml)

doc.search('period,xbrli|period').map(&:text) # => ["2017-02-10", "2017-02-11"]
CSS中的

'period,xbrli|period'表示“查找"period""xbrli:period"

另请参阅“How to avoid joining all text from Nodes when scraping”。