2

我有一个这样的红宝石课程:

class MyResponse
    attr_accessor :results
    def initialize(results = nil)
        @results = results
    end
end

有了这段代码,

resp = MyResponse.new 'Response text'
qname = XSD::QName.new('http://www.w3schools.com/furniture', :MyResponse)
xml = XSD::Mapping.obj2xml(resp, qname)
puts xml

我设法从那个类生成这个 xml:

<?xml version="1.0" encoding="utf-8" ?>
<n1:MyResponse xmlns:n1="http://www.w3schools.com/furniture">
  <results>Response text</results>
</n1:MyResponse>

但我希望<results>节点也有命名空间前缀,如<n1:results>

我试图解决这个问题很长时间。请帮帮我。

编辑:我只需要所有节点都有命名空间前缀。我对任何其他方式或图书馆持开放态度。

4

2 回答 2

2

我喜欢用ROXML读写 XML 。不幸的是,文档并不完整,尽管可以直接从代码文档中检索到许多信息。我没有成功给出一个完全符合您要求的示例(xmlns 节点只是 xmlns 而不是 xmlns:n1)但也许您可以完成它:

require 'roxml'

class Response
    include ROXML

    xml_name 'MyResponse'

    xml_namespace :n1

    xml_accessor :xmlns, from: :attr
    xml_accessor :results, from: "n1:results"

    def initialize
        @xmlns = "http://www.w3schools.com/furniture"
    end

end

response = Response.new
response.results = "Response text"
puts '<?xml version="1.0" encoding="utf-8" ?>'
puts response.to_xml
# <?xml version="1.0" encoding="utf-8" ?>
# <n1:MyResponse xmlns="http://www.w3schools.com/furniture">
#   <n1:results>Response text</n1:results>
# </n1:MyResponse>
于 2013-04-10T18:01:44.283 回答
1

从语义上讲,您不需要为每个节点加上命名空间前缀,以使它们都属于同一个命名空间。

出于所有目的,此 XML 等同于您的需求:

<?xml version="1.0" encoding="utf-8" ?>
<MyResponse xmlns="http://www.w3schools.com/furniture">
  <results>Response text</results>
</MyResponse>

考虑到这一点,您可以使用BuilderResponseXML 包装到其中(假设它实现了该to_xml方法 - 所有ActiveModel类都这样做):

b = ::Builder::XmlMarkup.new
xml = b.MyResponse :xmlns => 'http://www.w3schools.com/furniture' do
  b << resp.to_xml
end
于 2013-04-11T08:29:37.663 回答