与引入nokogiri
创建非自我封闭的空标签当我尝试创建引入nokogiri :: XML ::生成XML文档:与引入nokogiri
builder = Nokogiri::XML::Builder.new do |xml|
xml.my_tag({key: :value})
end
我得到以下XML标签:
<my_tag key="value"/>
它是自封闭的,但我需要完整的形式:
<my_tag key="value"></my_tag>
当我通过该节点内的值(或甚至一空间):
xml.my_tag("content", key: :value)
xml.my_tag(" ", key: :value)
它生成完整标签:
<my_tag key="value">content</my_tag>
<my_tag key="value"> </my_tag>
但是,如果我传递一个空字符串或nil
,甚至是空块:
xml.my_tag("", key: :value)
它会产生一个自我封闭的标记:
<my_tag key="value"/>
我相信应该有是一些属性或其他的东西可以帮助我,但简单的谷歌搜索没有找到答案。
我在“Building blank XML tags with Nokogiri?”中找到了一个可能的解决方案,但它将所有标签保存为非自封闭。
您可以使用Nokogiri的NO_EMPTY_TAGS
save option。 (XML自称关闭标签empty-element tags。)
builder = Nokogiri::XML::Builder.new do |xml|
xml.my_tag({key: :value})
end
puts builder.to_xml(save_with: Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS)
<?xml version="1.0"?>
<my_tag key="value"></my_tag>
每个选项是一位表示,所以你可以混合和匹配你想要的人。例如,设置NO_EMPTY_TAGS
本身会将XML保留在一行中,而不会间隔或缩进。如果您仍然希望它为人类设置格式,则可以按位或(|
)将其与FORMAT
选项配合使用。
builder = Nokogiri::XML::Builder.new do |xml|
xml.my_tag({key: :value}) do |my_tag|
my_tag.nested({another: :value})
end
end
puts builder.to_xml(
save_with: Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS
)
puts
puts builder.to_xml(
save_with: Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
Nokogiri::XML::Node::SaveOptions::FORMAT
)
<?xml version="1.0"?>
<my_tag key="value"><nested another="value"></nested></my_tag>
<?xml version="1.0"?>
<my_tag key="value">
<nested another="value"></nested>
</my_tag>
还有那个已经合并选项进入常用的功能列表的末尾的DEFAULT_*
一些选项。
您的更新提到“它将所有标签保存为非自封闭”,好像您可能只希望这个单一标签实例是非自封闭的,其余的是自封闭的。 Nokogiri不会产生这样的不一致的文档,但是如果必须的话,您可以将使用不同选项构建的一些XML字符串连接在一起。
现在我暂时使用此解决方案。问题是所有空标签都是自封闭的或者不封闭。但对于我的角落案件来说,这没关系。谢谢! –
出于好奇,为什么只有这一个标签不能自动关闭? –
其实我不确定是否需要。为了与API兼容,我需要全封闭标签。我会检查它。目前现在的解决方案是可以的。 –
根据规格,' '与' '相同,唯一的区别就是更短更干净。为什么你必须有第二种形式?这是一个要求还是一个愿望?由于XML文件可能非常庞大,如果能够使用较短的表单,则可以在进入数百万行时产生较小的文件。 –
正如我在下面回答的原因是在API中。它需要完整的标记符号 –