错误解析XML字符串的XDocument
问题描述:
我有这样的XML字符串bn
:错误解析XML字符串的XDocument
<Root><Row><ITEMNO>1</ITEMNO><USED>y</USED><PARTSOURCE>Buy</PARTSOURCE><QTY>2</QTY></Row><Row><ITEMNO>5</ITEMNO><PARTSOURCE>Buy</PARTSOURCE><QTY>5</QTY></Row></Root>
我试图将其转换为XDocument
这样的:
var doc = XDocument.Parse(bn);
不过,我得到这个错误:
Data at the root level is invalid. Line 1, position 1.
我错过了什么吗?
UPDATE:
这是我用它来创建XML字符串的方法:
public static string SerializeObjectToXml(Root rt)
{
var memoryStream = new MemoryStream();
var xmlSerializer = new XmlSerializer(typeof(Root));
var xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
xmlSerializer.Serialize(xmlTextWriter, rt);
memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
string xmlString = ByteArrayToStringUtf8(memoryStream.ToArray());
xmlTextWriter.Close();
memoryStream.Close();
memoryStream.Dispose();
return xmlString;
}
它添加到我不得不删除开始。我能从一开始就改变一些东西来改正它吗?
答
在字符串的开头有两个字符,尽管看不到它们,但它们仍然存在,导致字符串失败。试试这个:
<Root><Row><ITEMNO>1</ITEMNO><USED>y</USED><PARTSOURCE>Buy</PARTSOURCE><QTY>2</QTY></Row><Row><ITEMNO>5</ITEMNO><PARTSOURCE>Buy</PARTSOURCE><QTY>5</QTY></Row></Root>
有问题的字符是this。这是一个字节顺序标记,基本上告诉程序读取它是否大或小。看起来你是从一个没有正确解码的文件复制并粘贴的。
要删除它,你可以这样做:
yourString.Replace(((char)0xFEFF).ToString(), "")
答
接受的答案确实不必要string
处理,但在其辩护,这是因为你在不必要的处理string
当你不必。 .NET XML API的一个优点是它们具有健壮的内部结构。因此,不要尝试将string
送入XDocument.Parse
,请将Stream
或某种类型的TextReader
送入XDocument.Load
。通过这种方式,您不会愚弄手动管理编码及其创建的任何问题,因为内部部件将为您处理所有这些内容。字节顺序标记是脖子上的痛苦,但如果您使用XML处理,则.NET更容易处理它们。
如果我可以告诉它在那里,我如何从字符串中消除它? – davids
@davids使用'.Replace(((char)0xFEFF),'\ 0');'。 –
我一直希望没有它,但是我不知道为什么这个方法会添加它。我可以按照你的建议去除它。 – davids