使用 Nokogiri 创建非自闭空标签
Create non-self-closed empty tag with 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>
当我在节点内部传递一个值时(甚至 space):
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 calls self-closing tags 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_*
选项,它们已将选项组合成常用的选项。
您的更新提到了 "it saves all tags as non-self-closed",就好像您可能只希望这个单个标签实例是非自关闭的,其余的是自关闭的。 Nokogiri 不会生成那样不一致的文档,但如果必须,您可以将使用不同选项构建的一些 XML 字符串连接在一起。
当我尝试使用 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>
当我在节点内部传递一个值时(甚至 space):
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 calls self-closing tags 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_*
选项,它们已将选项组合成常用的选项。
您的更新提到了 "it saves all tags as non-self-closed",就好像您可能只希望这个单个标签实例是非自关闭的,其余的是自关闭的。 Nokogiri 不会生成那样不一致的文档,但如果必须,您可以将使用不同选项构建的一些 XML 字符串连接在一起。