我试图使用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"/>