2015-11-04 148 views
3

创建非自我封闭的空标签当我尝试创建引入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?”中找到了一个可能的解决方案,但它将所有标签保存为非自封闭。

+0

根据规格,''与''相同,唯一的区别就是更短更干净。为什么你必须有第二种形式?这是一个要求还是一个愿望?由于XML文件可能非常庞大,如果能够使用较短的表单,则可以在进入数百万行时产生较小的文件。 –

+0

正如我在下面回答的原因是在API中。它需要完整的标记符号 –

回答

1

您可以使用Nokogiri的NO_EMPTY_TAGSsave 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字符串连接在一起。

+0

现在我暂时使用此解决方案。问题是所有空标签都是自封闭的或者不封闭。但对于我的角落案件来说,这没关系。谢谢! –

+0

出于好奇,为什么只有这一个标签不能自动关闭? –

+0

其实我不确定是否需要。为了与API兼容,我需要全封闭标签。我会检查它。目前现在的解决方案是可以的。 –