如何在保留文本的同时删除 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/>
我有一些非常大的 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/>