0

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

它确实增加了我必须删除的开始。我可以更改一些内容以使其从一开始就正确吗?

4

3 回答 3

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(), "")
于 2013-07-03T18:01:52.383 回答
1

您的字符串开头有两个不可打印的字符(零宽度不间断空格)。
XML 不允许根元素之外的文本。

于 2013-07-03T18:00:52.453 回答
0

接受的答案进行了不必要的string处理,但是,在它的辩护中,这是因为你在不必要的string时候进行了不必要的处理。.NET XML API 的一大优点是它们具有强大的内部结构。因此,与其尝试喂 a stringto XDocument.Parse,不如喂 aStream或某种类型的TextReaderto XDocument.Load。这样,您就不会因为手动管理编码及其产生的任何问题而自欺欺人,因为内部将为您处理所有这些事情。字节顺序标记令人头疼,但如果您处理的是 XML,.NET 可以更轻松地处理它们。

于 2013-11-04T15:54:50.390 回答