我试图使用nokogiri分离使用名称空间的xml文档的一部分:

require 'nokogiri'
xml= "<s:Some xmlns:s=\"http://nmsc.com/nmsc\"><s:One></s:One></s:Some>"
n= Nokogiri.XML(xml)
n.xpath("//s:One", :s=>"http://nmsc.com/nmsc")[0].to_xml

这忽略了名称空间,只输出
"<s:One/>"

如何生成具有正确名称空间的XML,即:
<s:One xmlns:s="http://nmsc.com/nmsc" />


有趣的是,名称空间在那里:
> n.xpath("//s:One", :s=>"http://nmsc.com/nmsc")[0]
=> #(Element:0x3fb1a05d0ed0 {
  name = "One",
  namespace = #(Namespace:0x3fb1a05d1fc4 {
    prefix = "s",
    href = "http://nmsc.com/nmsc"
    })
  })

to_xml不包括在内。

最佳答案

如果创建新的XML文档并将选定节点添加到其中,则将包括命名空间信息:

require 'nokogiri'
xml = "<s:Some xmlns:s=\"http://nmsc.com/nmsc\"><s:One></s:One></s:Some>"
n = Nokogiri.XML(xml)
selected = n.xpath("//s:One", :s=>"http://nmsc.com/nmsc")[0]

doc = Nokogiri::XML::Document.new
doc.root = selected
puts doc.to_xml

输出:
<?xml version="1.0"?>
<s:One xmlns:s="http://nmsc.com/nmsc"/>

07-28 01:03