我有以下代表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更长)。我不能通过打印两个字符串来看到这种差异,它们看起来完全相同。 有人可以帮忙吗?
答案 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
),我建议您加载 而不是将其转换为字符串然后解析字符串。这将消除此问题和使您免于应用错误编码的可能性。