Trim 标签内有空格?

Trim whitespace inside tags?

我正在使用 xmllint 重新格式化一些 xml。我注意到它似乎单独留下了封闭的文本。例如,这个

<tag>
<p>
<i>
test
</i>
</p>
</tag>

变成这样

<tag>
    <p>
        <i>
test
</i>
    </p>
</tag>

有没有办法强制它把文本放在开始标签后面,紧接着是结束标签?理想情况下,我想要这样的东西:

<tag>
    <p>
        <i>test</i>
    </p>
</tag>

我想这相当于让它忽略标签内的前导和尾随空格。我可以通过正则表达式进行一些预处理来做到这一点,但是有什么本地方法吗?

TIA。

您应该可以使用 tidy 来做到这一点:

echo '<tag>
<p>
<i>
test
</i>
</p>
</tag>' |    tidy -xml -iq

输出:

<tag>
  <p>
    <i>test</i>
  </p>
</tag>

通常 --noblanks 会去除 ignorable/insignificant 空格,但在这种情况下,xmllint 认为空格很重要,不会忽略它。

除了 "tidy" 在另一个答案中的建议,您还可以 use xmlstarlet 规范化所有文本节点的空白...

命令行

xmlstarlet ed -u "//text()" -x "normalize-space()" input.xml

输出

<tag>
  <p>
    <i>test</i>
  </p>
</tag>
$ xmlstarlet ed -u //*[not(*)] -x normalize-space(.) file.xml

<?xml version="1.0"?>
<tag>
  <p>
    <i>test</i>
  </p>
</tag>