2013-07-03 96 views
0

我有这样的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; 
} 

它添加到我不得不删除开始。我能从一开始就改变一些东西来改正它吗?

回答

2

在字符串的开头有两个字符,尽管看不到它们,但它们仍然存在,导致字符串失败。试试这个:

<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(), "") 
+0

如果我可以告诉它在那里,我如何从字符串中消除它? – davids

+0

@davids使用'.Replace(((char)0xFEFF),'\ 0');'。 –

+0

我一直希望没有它,但是我不知道为什么这个方法会添加它。我可以按照你的建议去除它。 – davids

1

在字符串的开头处有两个不可打印的字符(Zero-Width No-break Space)。
XML不允许根元素以外的文本。

+0

这些可能是来自Unicode编码的字节顺序标记。他们仍然在你的文档中表明你没有明确地对它进行编码,首先。这是一个很好的做法。 – Curt

+0

我不敢相信我错过了 – davids

+0

http://blogs.msdn.com/b/michkap/archive/2005/01/20/357028.aspx – SLaks

0

接受的答案确实不必要string处理,但在其辩护,这是因为你在不必要的处理string当你不必。 .NET XML API的一个优点是它们具有健壮的内部结构。因此,不要尝试将string送入XDocument.Parse,请将Stream或某种类型的TextReader送入XDocument.Load。通过这种方式,您不会愚弄手动管理编码及其创建的任何问题,因为内部部件将为您处理所有这些内容。字节顺序标记是脖子上的痛苦,但如果您使用XML处理,则.NET更容易处理它们。