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

本文关键字:XDocument 出错 XML 字符串 | 更新日期: 2023-09-27 18:20:50

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

它确实增加了我必须删除的开头。我能从一开始就修改一下吗?

将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>

有问题的人物是这样的。这是一个字节顺序标记,基本上告诉读取它的程序它是大端序还是小端序。看起来你是从一个未正确解码的文件中复制粘贴的。

要删除它,你可以使用这个:

yourString.Replace(((char)0xFEFF).ToString(), "")

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

公认的答案会进行不必要的string处理,但为其辩护的是,这是因为你在不必要的时候不必要地处理string。.NET XML API的一大优点是它们具有强大的内部结构。因此,与其尝试向XDocument.Parse馈送string,不如向XDocument.Load馈送Stream或某种类型的TextReader。这样,您就不会手动管理编码及其产生的任何问题,因为内部将为您处理所有这些问题。字节顺序标记是一个棘手的问题,但如果您处理XML,.NET会使处理它们变得更容易。