Nokogiri,如何避免子节点中的命名空间?

时间:2014-05-15 07:36:53

标签: xml nokogiri

我有这个工作代码:

require 'nokogiri'

NAMESPACES = {"xmlns:soap" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:soap-enc" => "http://schemas.xmlsoap.org/soap/encoding/", "xmlns:cwmp" => "urn:dslforum-org:cwmp-1-0", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xml:xsd" => "http://www.w3.org/2001/XMLSchema"}

b = Nokogiri::XML::Builder.new
b[:soap].Envelope(NAMESPACES) {
    b[:soap].Header {}
    b[:soap].Body {
        b[:cwmp].GetParameterValues() {
            b.ParameterNames() {
                b.string "test"
            }
        }
    }
}

puts b.to_xml

产生:

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:cwmp="urn:dslforum-org:cwmp-1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xml:xsd="http://www.w3.org/2001/XMLSchema">
   <soap:Header/>
   <soap:Body>
      <cwmp:GetParameterValues>
         <cwmp:ParameterNames>
            <cwmp:string>test</cwmp:string>
         </cwmp:ParameterNames>
      </cwmp:GetParameterValues>
   </soap:Body>
</soap:Envelope>

有没有办法避免“ParameterNames”和“string”节点上的命名空间“cwmp”?

由于

1 个答案:

答案 0 :(得分:2)

一种方法是将默认命名空间添加到命名空间列表中。 Nokogiri将使用默认命名空间而不是父节点的命名空间。

只需将默认命名空间添加到NAMESPACES-hash中。默认命名空间的默认模式为"xmlns" => "http://someuri.org/"