如何用Nokogiri让空标签自动关闭?

时间:2011-03-28 13:40:58

标签: ruby xml nokogiri

我在ERB中创建了一个XML模板。我在导出过程中用数据库中的数据填充它。

在某些情况下,存在空值,在这种情况下,元素可能为空,如下所示:

<someitem>

</someitem>

在这种情况下,接收导出的客户端希望将其转换为自动关闭标记:

<someitem/>

我正试图看看如何让Nokogiri这样做,但我还没有看到它。有人知道如何使Nokogiri自动关闭空XML标签吗?

更新

正则表达式足以完成我上面指定的操作,但客户端现在还希望其子项全部为空的标记可以自动关闭。所以这个:

<someitem>
  <subitem>

  </subitem>
  <subitem>

  </subitem>
</someitem>

......也应该

<someitem/>

我认为这需要使用Nokogiri。

2 个答案:

答案 0 :(得分:5)

搜索

<([^>]+)>\s*</\1>

并替换为

<\1/>

在Ruby中:

result = subject.gsub(/<([^>]+)>\s*<\/\1>/, '<\1/>')

<强>解释

<       # Match opening bracket
(       # Match and remember...
 [^>]+  # One or more characters except >
)       # End of capturing group
>       # Match closing bracket
\s*     # Match optional whitespace & newlines
<       # Match opening bracket
/       # Match /
\1      # Match the contents of the opening tag
>       # Match closing bracket

答案 1 :(得分:1)

几个问题:

  1. <foo></foo><foo />相同,为什么要担心这么微小的细节呢?如果它在语法上是重要的,因为两者之间的文本节点是"\n",那么在ERB模板中放置一个测试,检查那里的值,如果没有初始化,则输出自闭标签?请参阅“Yak shaving”。
  2. 为何涉及Nokogiri?您应该能够在ERB中生成正确的XML,因为您可以控制模板。
  3. 编辑 - Nokogiri的行为是不重写解析的XML,除非必须这样做。我怀疑你必须删除有问题的节点,然后将其重新插入一个空节点,让Nokogiri输出你想要的东西。