如何使用ColdFusion从XML字符串中删除所有多余的空格?

3

我从客户端收到一个XML字符串,格式如下...

<root>
   <result success="1"/>
   <userID>12345</userID>
   <classID>56543</classID>
</root>

我需要将这个字符串压缩成以下内容...
<root><result success="1"/><userID>12345</userID><classID>56543</classID></root>

因此,所有的空格都被删除了,除了标签内部的空格(所以"result"和"success"之间仍然存在空格)。

我已经使用replace语句来删除换行符、回车符等,但是我无法在忽略标签内空格的情况下删除空格。有没有办法使用正则表达式或其他方法来完成这个任务?

4个回答

7
下面的正则表达式将匹配不在标签内的空格:
[\s]+(?![^><]*>)

或者

[\s]+(?![^><]*(?:>|<\/))

只需将匹配的空格替换为空字符串即可。

演示

编辑从这里开始

根据评论,针对ColdFusion的情况,它的工作方式如下...

strClean = REReplace(strOriginal,"[\s]+(?![^><]*(?:>|<\/))","","All");

运行得非常好,谢谢! - Carl
如果有人感兴趣,在 ColdFusion 的上下文中,它的工作原理如下...strClean = REReplace(strOriginal,"[\s]+(?![^><]*(?:>|</))","","All"); - Carl
我在JavaScript中测试了这些正则表达式,它们不能正常工作。 [\s]+(?![^><]*>)会切割掉不该被切割的空格(从文本内部)。另一方面,[\s]+(?![^><]*(?:>|<\/))会错过一些空格。 - Greg Rynkowski
如果您的文本中有锚点标签,它将删除<a>标签和开放父标签之间的空格。 - Otti

2
简单的正则表达式是什么: >\s+?<,替换为 ><。相比被接受的答案,这样做能够保留叶子/终端元素中的空格。

1
我没有看到任何正则表达式方法可以得到我想要的精确结果,我有一种预感,用正则表达式处理XML并不是真正合适的做法。对于XML,我喜欢保持在XML领域内,您可以使用XmlTransform来实现所需内容。
使用此XSL
<xsl:stylesheet version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" omit-xml-declaration="yes"/>

  <xsl:strip-space elements="*"/>

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

</xsl:stylesheet>

你可以简单地这样做:

xmlOut = XmlTransform(xmlIn, stripSpaceXSL);

查看演示:https://trycf.com/gist/d6be6b6b8e04ccea3dbd9ece9c60fa2c/lucee5?theme=monokai


0

我看到的最简单且有效的解决方案是将角括号外侧的所有空格替换为:

  • >\s+替换为>,并
  • \s+<替换为<

在ColdFusion中,应该是类似这样的:

str = REReplace(str, ">\s+", ">", "All");
str = REReplace(str, "\s+<", "<", "All");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接