我有这个XML字符串bn
:
<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.
我错过了什么吗?
更新
这是我用来创建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;
}
它确实增加了我必须删除的开头。我可以改变一些东西以使其从一开始就正确吗?
答案 0 :(得分: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(), "")
答案 1 :(得分:1)
您的字符串开头有两个不可打印的字符(Zero-Width No-break Space) XML不允许根元素之外的文本。
答案 2 :(得分:0)
接受的答案会进行不必要的string
处理,但是,在其辩护中,这是因为当您不必要时,您不必要地处理string
。 .NET XML API的一大优点是它们具有强大的内部功能。因此,不要尝试将string
提供给XDocument.Parse
,而是将Stream
或某种类型的TextReader
提供给XDocument.Load
。这样,你就不会愚弄手动管理编码及其创建的任何问题,因为内部会为你处理所有这些问题。字节顺序标记是一个痛苦的问题,但如果你处理XML,那么.NET可以更容易地处理它们。