我在ERB中创建了一个XML模板。我在导出过程中用数据库中的数据填充它。
在某些情况下,存在空值,在这种情况下,元素可能为空,如下所示:
<someitem>
</someitem>
在这种情况下,接收导出的客户端希望将其转换为自动关闭标记:
<someitem/>
我正试图看看如何让Nokogiri这样做,但我还没有看到它。有人知道如何使Nokogiri自动关闭空XML标签吗?
正则表达式足以完成我上面指定的操作,但客户端现在还希望其子项全部为空的标记可以自动关闭。所以这个:
<someitem>
<subitem>
</subitem>
<subitem>
</subitem>
</someitem>
......也应该
<someitem/>
我认为这需要使用Nokogiri。
答案 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)
几个问题:
<foo></foo>
与<foo />
相同,为什么要担心这么微小的细节呢?如果它在语法上是重要的,因为两者之间的文本节点是"\n"
,那么在ERB模板中放置一个测试,检查那里的值,如果没有初始化,则输出自闭标签?请参阅“Yak shaving”。编辑 - Nokogiri的行为是不重写解析的XML,除非必须这样做。我怀疑你必须删除有问题的节点,然后将其重新插入一个空节点,让Nokogiri输出你想要的东西。