ruby - 使用 Nokogiri 创建非自闭空标签

标签 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,甚至是一个空 block :

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 字符串连接在一起。

关于ruby - 使用 Nokogiri 创建非自闭空标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33524001/

相关文章:

ruby - 从迁移运行 Thor 任务

java - JAX-WS - 创建大量 xjc java 对象时如何提高性能?

ruby - Xpath 在 Nokogiri 中不返回任何内容

ruby - 查找包含特定文本的表格

ruby - 如何关闭 Rack 应用程序中的异常?

ruby - 在 Ruby CSV 中,如何将空白 , 而不是 ,""写入文件?

ruby-on-rails - Mongoid 3.0 嵌入 1-N 查询,用于列出所有嵌入字段

xml - 限制 XSD 中的独占键值对

javascript - 无法获取属性值 'nodeValue' : object is null or undefined in IE

ruby - 如何构建 <scp :price unit ='USD' >25</scp:price> in Nokogiri XML Builder