将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;
}
它确实增加了我必须删除的开头。我能从一开始就修改一下吗?
在字符串的开头有两个字符,尽管您看不到它们,但它们仍然存在,并使字符串失败。试试这个:
<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会使处理它们变得更容易。