C#从字符串中删除特殊字符

本文关键字:删除 特殊字符 字符串 | 更新日期: 2023-09-27 17:57:27

我有下面的字符串,它表示一个xml:

string xmlStr7 = "<?xml version='"1.0'" encoding='"utf-8'"?>'r'n<Response xmlns:xsd='"http://www.w3.org/2001/XMLSchema'" xmlns:xsi='"http://www.w3.org/2001/XMLSchema-instance'">'r'n  <Market>en-US</Market>'r'n  <AnswerSet ID='"0'">'r'n    <Answers>'r'n      <Answer ID='"0'">'r'n        <Choices>'r'n          <Choice ID='"2'" />'r'n          <Choice ID='"8'" />'r'n        </Choices>'r'n      </Answer>'r'n      <Answer ID='"1'">'r'n        <Choices>'r'n          <Choice ID='"1'" />'r'n          <Choice ID='"4'" />'r'n        </Choices>'r'n      </Answer>'r'n      <Answer ID='"2'">'r'n        <Choices>'r'n          <Choice ID='"1'" />'r'n          <Choice ID='"7'" />'r'n        </Choices>'r'n      </Answer>'r'n      <Answer ID='"3'">'r'n        <Choices>'r'n          <Choice ID='"4'" />'r'n        </Choices>'r'n      </Answer>'r'n    </Answers>'r'n  </AnswerSet>'r'n</Response>";

我想把它解析成一个XDocument对象,为了做到这一点,我必须去掉所有换行符和不必要的空格(否则我会遇到解析错误)。我已经手动删除了的特殊字符,并看到当我使用以下字符串时解析是有效的:

string xmlStr2 = "<?xml version='"1.0'" encoding='"utf-8'"?><Response xmlns:xsd='"http://www.w3.org/2001/XMLSchema'" xmlns:xsi='"http://www.w3.org/2001/XMLSchema-instance'"><Market>en-US</Market><AnswerSet ID='"0'"><Answers><Answer ID='"0'"><Choices><Choice ID='"2'" /><Choice ID='"8'" /></Choices></Answer><Answer ID='"1'"><Choices><Choice ID='"1'" /><Choice ID='"4'" /></Choices></Answer><Answer ID='"2'"><Choices><Choice ID='"1'" /><Choice ID='"7'" /></Choices></Answer><Answer ID='"3'"><Choices><Choice ID='"4'" /></Choices></Answer></Answers></AnswerSet></Response>";

我使用以下代码以编程方式实现这一点:

public static string replaceSubString(string st)
    {
        string pattern = ">''s+<";
        string replacement = "><";
        Regex rgx = new Regex(pattern);
        string result = rgx.Replace(st, replacement);
        return result;
    }

通过调用这个方法,我希望得到一个字符串,我将能够将其解析为XDocument对象:

string newStr = replaceSubString(xmlStr7);
XDocument xmlDoc7 = XDocument.Parse(newStr);

然而,这是行不通的。此外,这个字符串和我手动删除所有特殊字符的字符串xmlStr2之间似乎有区别(字符串.Compare返回false,newStr在1个字符中比xmlStr2长)。我看不出这两个字符串的区别,它们看起来完全一样。

C#从字符串中删除特殊字符

字符串以字节顺序标记(U+FEFF)开头。

理想情况下,你不应该一开始就把它放进字符串中,但如果你,你应该去掉它:

string text = ...;
if (text.StartsWith("'ufeff"))
{
    text = text.Substring(1);
}
XDocument doc = XDocument.Parse(text);

有趣的是,XDocument.Load(Stream)可以在数据开始时处理BOM,但XDocument.Load(TextReader)不能。据推测,读者在阅读BOM时会剥去BOM。

目前还不清楚您的数据来自哪里,但如果您在某个地方有二进制格式的数据(例如byte[]Stream),那么我建议您只加载,而不是将其转换为字符串,然后解析该字符串。这将消除这个问题使您免于应用错误编码的可能性。