将XML字符串解析为XDocument时出错

时间:2013-07-03 17:58:44

标签: c# xml-parsing

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

它确实增加了我必须删除的开头。我可以改变一些东西以使其从一开始就正确吗?

3 个答案:

答案 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可以更容易地处理它们。