删除 XML 标记之间的空格和双引号

删除 XML 标记之间的空格和双引号

我想从<ns:tag2>Linux 上的 XML 文件中的 XML 标记值中删除空格和引号(仅针对此标记删除空格,而不是其他位置)。

XML 内容示例如下所示。

<ns:tag1>
    <ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2> 
</ns:tag1>

但我需要如下所示写入文件。

<ns:tag1>
    <ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2> 
</ns:tag1>

我已经在以下位置看到了解决方案从 xml 文件中删除带有空格和引号的字符串并尝试使用 sed 命令删除引号,但没有成功。

sed  's/ ""//g'  temp.xml

请建议我正确的语法。如果我们可以通过两个不同的步骤来完成此操作,那就太好了。

答案1

这是完成这项工作的 XSLT 3.0 转换。

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:mode on-no-match="shallow-copy"/>
  <xsl:template match="ns:tag2/text()" xmlns:ns="xxxxx">
      <xsl:value-of select="translate(., '&quot; ', '')"/>        
  </xsl:template>
</xsl:template>

替换xxxxx为实际的命名空间 URI(示例中未显示)。

不要尝试使用非 XML 感知工具(如 sed)在词法级别处理 XML。我们在 StackOverflow 上看到数百个问题,这些问题都是由人们不得不处理不良 XML 造成的,而这些问题总是由此类方法产生的。

答案2

您可以使用 XML 解析器来解析 XML。我喜欢xmlstarlet自己。

我修改了您的示例以提供(模糊)合理的命名空间声明ns

<ns:root xmlns:ns="localns">
  <ns:tag1>
    <ns:tag2>Abcdef qwert/denn+hkg kmknn xyz""""""""""</ns:tag2>
  </ns:tag1>
</ns:root>

此时您可以将空格和引号替换为没有什么

xmlstarlet edit -N ns=localns -u '//ns:tag2/text()' -x "translate(., ' \"', '')" xmlfile

结果

<?xml version="1.0"?>
<ns:root xmlns:ns="localns">
  <ns:tag1>
    <ns:tag2>Abcdefqwert/denn+hkgkmknnxyz</ns:tag2>
  </ns:tag1>
</ns:root>

相关内容