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

noo*_*and 1 .net c# xml

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

示例#1:

屏幕截图#1

示例#2:

屏幕截图#2

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

编辑2014-09-03 20:20 IST

为了回应@CodeCaster下面的评论,我NameValueCollection使用a的实例上传值(以a的形式)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);
Run Code Online (Sandbox Code Playgroud)

这是xmlDocument整个都有令人不快的角色

Tom*_*lak 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>
Run Code Online (Sandbox Code Playgroud)

使用XslCompiledTransform该类将其应用于输入XML.


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

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


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

return Regex.Replace(value, @"\s+", " ").Trim();
Run Code Online (Sandbox Code Playgroud)

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