gpt4 book ai didi

xml - 如何使用 Nokogiri Builder 创建带有命名空间根元素的 XML 文档

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:29 27 4
gpt4 key购买 nike

我正在为需要命名空间的 XML 数据实现一个导出器。我正在使用 Nokogiri 的 XML Builder(版本 1.4.0)来执行此操作,但是,我无法让 Nokogiri 创建具有 namespace 的根节点。

这个有效:

Nokogiri::XML::Builder.new { |xml| xml.root('xmlns:foobar' => 'my-ns-url') }.to_xml

<?xml version="1.0"?>
<root xmlns:foobar="my-ns-url"/>

这样做:

Nokogiri::XML::Builder.new do |xml| 
xml.root('xmlns:foobar' => 'my-ns-url') { xml['foobar'].child }
end.to_xml

<?xml version="1.0"?>
<root xmlns:foobar="my-ns-url">
<foobar:child/>
</root>

但是,我需要像 <foo:root> 这样的东西这不起作用:

Nokogiri::XML::Builder.new { |xml| xml['foobar'].root('xmlns:foobar' => 'my-ns-url') }.to_xml

NoMethodError: undefined method `namespace_definitions' for #<Nokogiri::XML::Document:0x11bfef8 name="document">

显然, namespace 必须在使用前定义,因此无法将 namespace 添加到根节点。

我在 Nokogiri 邮件列表中找到了“Define root node with a namespace?”,但没有回复。

有没有人有解决办法?

最佳答案

require 'rubygems'
require 'nokogiri'

puts Nokogiri::XML::Builder.new do |xml|
xml.root("xmlns:foo"=>"url") do
xml.parent.namespace = xml.parent.namespace_definitions.find{|ns|ns.prefix=="foo"}
xml['foo'].child
end
end.to_xml

在定义命名空间之前,您不能使用 xml['foo'],I.E.因此,在将其作为参数传递给根节点之前,上面的代码事后将命名空间添加到了根节点。

关于xml - 如何使用 Nokogiri Builder 创建带有命名空间根元素的 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com