How can I make empty tags self-closing with Nokogiri?

你离开我真会死。 提交于 2019-12-01 18:33:05
Tim Pietzcker

Search for

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

and replace with

<\1/>

In Ruby:

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

Explanation:

<       # 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

A couple questions:

  1. <foo></foo> is the same as <foo />, so why worry about such a tiny detail? If it is syntactically significant because the text node between the two is a "\n", then put a test in your ERB template that checks for the value that would go there, and if it's not initialized output the self-closing tag instead? See "Yak shaving".
  2. Why involve Nokogiri? You should be able to generate correct XML in ERB since you're in control of the template.

EDIT - Nokogiri's behavior is to not-rewrite parsed XML unless it has to. I suspect you'd have to remove the node in question, then reinsert it as an empty node to get Nokogiri to output what you want.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!