我正在尝试使用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
不包括它。
答案 0 :(得分:4)
如果您创建一个新的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"/>