如何在保留文本的同时删除 XML 标签之间的所有正斜杠?

How Do I Remove All Forward Slashes Between XML Tags While Leaving the Text?

我有一些非常大的 XML 文件。我需要删除开始和结束 XML 标签之间的所有正斜杠。正斜杠可以用空格代替。我需要在不删除结束 HTML 标记中的正斜杠的情况下执行此操作。非常感谢任何帮助!

这个:

<XML>
<REDACTED27> CT LSPINE W/O CONT XR29 </REDACTED27>
<sampletag>str1/str2/str3</sampletag>
</XML>

变成这样:

<XML>
<REDACTED27> CT LSPINE W O CONT XR29 </REDACTED27>
<sampletag>str1 str2 str3</sampletag>
</XML>

使用 XML 感知工具来解析实际的 XML。例如,在xsh中,你可以只写

open file.xml ;
for //text() set . xsh:subst(., '/', ' ', 'g') ;
save :b ;

由于您包含了 notepad++ 标签,我建议将 "Find what" 中的所有 (Ctrl+H) 替换为 regex(以及 space "Replace with")

(?<!<)/(?!>)

负向后视 (?<!<) 确保没有字符 < 出现在 / 之前,负向前视 (?!>) 确保没有 > 然后。在这里,我假设没有 <//> 出现在标签之外,以便更快地处理您的 "VERY large XML files".

最好不要使用 sed、awk 或任何其他文本编辑实用程序。

使用 XML 编辑实用程序,例如 XSLT。

下面的转换保持输入不变(除了很好地缩进,但你可以禁用它)并且只修改文本节点(即东西 "between the opening and closing XML tags") :

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="text()">
        <xsl:value-of select="translate(., '/', ' ')" />
    </xsl:template>
</xsl:transform>

另存为removeslashes.xsl 并在命令行中使用 xsltproc

xsltproc -o outputfile.xml removeslashes.xsl inputfile.xml

你应该安装 xmlstarlet,然后基本上:

xmlstarlet pyx source.xml | perl -pe 'm/^-/ && s/\// /g' | xmlstarlet p2x > target.xml

在 pyx 中,以“-”开头的行表示文本节点,因此您可以替换其中的斜杠,然后 assemble xml 返回而不触及任何其他内容。

缺少 xml 感知工具,这适用于简单结构

$ sed -r 's_([^<])/([^>])_ _g' xml

<XML>
<REDACTED27> CT LSPINE W O CONT XR29 </REDACTED27>
<sampletag>str1 str2 str3</sampletag>
</XML>
<test/>