Nokogiri的xml输出上的命名空间

时间:2014-02-19 18:57:38

标签: ruby xml nokogiri

我正在尝试使用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不包括它。

1 个答案:

答案 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"/>