我想从<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(., '" ', '')"/>
</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>