使用Nokogiri创建非自闭式空标签

时间:2015-11-04 14:10:05

标签: ruby xml nokogiri

当我尝试使用Nokogiri :: XML :: Builder创建XML文档时:

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?”中找到了一个可能的解决方案,但它将所有代码保存为非自我关闭。

1 个答案:

答案 0 :(得分:1)

您可以使用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_*选项已将选项组合成常用用途。

您的更新提及&#34;它将所有标记保存为非自我关闭&#34;,就好像您可能只希望此单个标记实例非自我关闭,其余标记为自我关闭。 Nokogiri不会像这样生成一个不一致的文档,但如果必须,你可以将一些XML字符串连接在一起,用不同的选项构建它们。