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

Nic*_*nko 5 ruby xml nokogiri

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

builder = Nokogiri::XML::Builder.new do |xml|
  xml.my_tag({key: :value})
end
Run Code Online (Sandbox Code Playgroud)

我得到以下 XML 标签:

<my_tag key="value"/>
Run Code Online (Sandbox Code Playgroud)

它是自封闭的,但我需要完整的表格:

<my_tag key="value"></my_tag>
Run Code Online (Sandbox Code Playgroud)

当我在节点(甚至是空格)内传递一个值时:

xml.my_tag("content", key: :value)
xml.my_tag(" ", key: :value)
Run Code Online (Sandbox Code Playgroud)

它生成完整的标签:

<my_tag key="value">content</my_tag>
<my_tag key="value"> </my_tag>
Run Code Online (Sandbox Code Playgroud)

但是如果我传递一个空字符串或nil,甚至是一个空块:

xml.my_tag("", key: :value)
Run Code Online (Sandbox Code Playgroud)

它生成一个自闭合标签:

<my_tag key="value"/>
Run Code Online (Sandbox Code Playgroud)

我相信应该有一些属性或其他东西可以帮助我,但简单的谷歌搜索没有找到答案。

我在“使用 Nokogiri 构建空白 XML 标签? ”中找到了一个可能的解决方案,但它将所有标签保存为非自关闭标签。

Kri*_*ján 3

您可以使用 Nokogiri 的NO_EMPTY_TAGS 保存选项。(XML 将自闭合标签称为空元素标签。)

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)
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0"?>
<my_tag key="value"></my_tag>
Run Code Online (Sandbox Code Playgroud)

每个选项都以位的形式表示,因此您可以混合搭配您想要的选项。例如,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
)
Run Code Online (Sandbox Code Playgroud)
<?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>
Run Code Online (Sandbox Code Playgroud)

DEFAULT_*列表末尾还有一些选项已经将选项组合成常见用途。

您的更新提到“它将所有标签保存为非自关闭”,好像您只希望这个单个标签实例是非自关闭的,而其余标签实例是自关闭的。Nokogiri 不会生成这样不一致的文档,但如果必须的话,您可以将使用不同选项构建的一些 XML 字符串连接在一起。