我想找到这样的元素。
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!
,但我不想使用它,因为我需要它的另一个地方。
也许复制doc
和doc_without_namespaces
是个好主意?
有一种简单易行的方法来处理这种情况吗?
答案 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”。