我从客户端收到一个XML字符串,格式如下......
<root>
<result success="1"/>
<userID>12345</userID>
<classID>56543</classID>
</root>
我需要将此字符串压缩为以下内容...
<root><result success="1"/><userID>12345</userID><classID>56543</classID></root>
因此,除了标签内部之外,所有的空格都被移除(因此空间仍然存在于&#34;结果&#34;和&#34;成功&#34;)。
我使用replace
语句来删除换行符,回车符等,但是我无法删除空格而忽略了标记内的空格。有没有办法使用正则表达式或其他方法来实现这一目标?
答案 0 :(得分:4)
以下regx将匹配不在标签内的空格
[\s]+(?![^><]*>)
OR
[\s]+(?![^><]*(?:>|<\/))
只需用空字符串替换匹配的空格。
编辑从这里开始
从评论中 - 在ColdFusion的背景下,它就像这样......
strClean = REReplace(strOriginal,"[\s]+(?![^><]*(?:>|<\/))","","All");
答案 1 :(得分:0)
简单的正则表达式如何:>\s+?<
并替换为><
。作为对已接受答案的奖励,这将保留叶/终端元素中的空白。
答案 2 :(得分:0)
我看到的最简单,最有效的解决方案是替换尖括号外侧附近的所有空格:
>\s+
>
和
{li> \s+<
<
。
在ColdFusion中它应该是这样的:
str = REReplace(str, ">\s+", ">", "All");
str = REReplace(str, "\s+<", "<", "All");
答案 3 :(得分:0)
我没有看到使用任何正则表达式方法想要的确切结果,并且我有直觉认为用正则表达式处理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