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

时间:2014-04-07 19:52:25

标签: c# string special-characters

我有以下代表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之间似乎有区别,我从中手动删除了所有特殊字符串(string.Compare返回false,而newStr在1个字符串中比xmlStr2更长)。我不能通过打印两个字符串来看到这种差异,它们看起来完全相同。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

您的字符串以byte order mark(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),我建议您加载 而不是将其转换为字符串然后解析字符串。这将消除此问题使您免于应用错误编码的可能性。