从XML文本(或任何字符串)中删除非打印字符

时间:2014-09-03 15:43:47

标签: c# .net xml

我从一家公司获得了一份XML文档,并在其中嵌入了标签,换行符和其他非打印垃圾。框架中是否有一些方法可以使用这样的字符串并删除这些不需要的字符?下面的一些截图,这些不是调试器/可视化工具,因为当我进行字符串比较时它们实际上正在发挥作用

示例#1:

Example screenshot #1

示例#2:

Example screenshot #2

FWIW这些XML文档来自UTF8编码响应Web请求。

EDIT 2014-09-03 20:20 IST

为了回应@CodeCaster下面的评论,我使用NameValueCollection的实例上传值(以WebClient的形式)。 response回复给我,我会做以下事情:

string reply = System.Text.Encoding.UTF8.GetString(response);
XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(new NameTable());
xmlNamespaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(reply);

这是xmlDocument,其中包含违规字符

1 个答案:

答案 0 :(得分:5)

对于XSLT来说,这是一项微不足道的任务。

此XSLT样式表从输入XML文档中规范化(从中删除过多的空白)所有文本节点,而保持其他所有内容不受影响。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="text()">
    <xsl:value-of select="normalize-space()" />
  </xsl:template>

</xsl:stylesheet>

使用XslCompiledTransform class将其应用于输入XML。


请注意,空格有时可能带有意义。对所有这些进行讨论可能会适得其反。

如果有疑问,请将匹配表达式(<xsl:template match="text()">)调整为更具体的内容(例如<xsl:template match="message//text()"><xsl:template match="status/text()">),以仅影响您真正的文本节点


当然,从文档中提取正则表达式后,可以通过将正则表达式应用于有问题的字符串值来实现相同的效果:

return Regex.Replace(value, @"\s+", " ").Trim();

使用XSLT在一个步骤中预先清理输入XML可能更方便。