18

我正在从 xxx URl 读取 xml,但由于缺少 Root 元素而出现错误。

我读取 xml 响应的代码如下:

  XmlDocument doc = new XmlDocument();
  doc.Load("URL from which i am reading xml");
  XmlNodeList nodes = doc.GetElementsByTagName("Product");
  XmlNode node = null;
  foreach (XmlNode n in nodes)
   {
   }

xml响应如下:

<All_Products>
   <Product>
  <ProductCode>GFT</ProductCode>
  <ProductName>Gift Certificate</ProductName>
  <ProductDescriptionShort>Give the perfect gift. </ProductDescriptionShort>
  <ProductDescription>Give the perfect gift.</ProductDescription>
  <ProductNameShort>Gift Certificate</ProductNameShort> 
  <FreeShippingItem>Y</FreeShippingItem>
  <ProductPrice>55.0000</ProductPrice>
  <TaxableProduct>Y</TaxableProduct>
   </Product>    
 </All_Products>

你能告诉我哪里出错了。

4

6 回答 6

79

以防万一其他人从 Google 登陆,我在使用 XDocument.Load(Stream) 方法时被此错误消息所困扰。

XDocument xDoc = XDocument.Load(xmlStream);  

在尝试加载 Stream 之前,请确保将流位置设置为 0(零),这是一个我总是忽略的简单错误!

if (xmlStream.Position > 0)
{
    xmlStream.Position = 0;
}
XDocument xDoc = XDocument.Load(xmlStream); 
于 2014-05-20T10:26:01.920 回答
15

确保您的 XML 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<rootElement>
...
</rootElement>

此外,空白 XML 文件将返回相同的 Root 元素丢失异常。每个 XML 文件必须有一个包含所有其他元素的根元素/节点。

于 2012-04-12T14:42:37.083 回答
5

嗨,这是一种奇怪的方式,但请尝试一次

  1. 将文件内容读入字符串
  2. 打印字符串并检查您是否获得了正确的 XML
  3. 您可以使用XMLDocument.LoadXML(xmlstring)

我尝试使用您的代码和相同的 XML,而不添加任何适用于我的 XML 声明

XmlDocument doc = new XmlDocument();
        doc.Load(@"H:\WorkSpace\C#\TestDemos\TestDemos\XMLFile1.xml");
        XmlNodeList nodes = doc.GetElementsByTagName("Product");
        XmlNode node = null;
        foreach (XmlNode n in nodes)
        {
            Console.WriteLine("HI");
        }

正如菲尔在下面的答案中所述,如果 xmlStream 位置不为零,请将其设置为零。

if (xmlStream.Position > 0)
{
    xmlStream.Position = 0;
}
XDocument xDoc = XDocument.Load(xmlStream); 
于 2012-04-12T14:44:20.323 回答
3

如果您从远程位置加载 XML 文件,我会使用像Fiddler这样的嗅探器检查文件是否实际下载正确。

我编写了一个快速控制台应用程序来运行您的代码并解析文件,它对我来说很好用。

于 2012-04-12T14:42:21.160 回答
2
  1. 检查位于config文件夹中的trees.config文件......有时(我不知道为什么)这个文件变成空的,就像有人删除里面的内容一样......在你的本地电脑上备份这个文件然后当出现此错误 - 用您的本地文件替换服务器文件。这就是我在发生此错误时所做的。

  2. 检查服务器上的可用空间。有时这就是问题所在。

祝你好运。

于 2016-03-15T08:26:04.967 回答
2

当我尝试读取从存档中提取到内存流的 xml 时,我遇到了同样的问题。

 MemoryStream SubSetupStream = new MemoryStream();
        using (ZipFile archive = ZipFile.Read(zipPath))
        {
            archive.Password = "SomePass";
            foreach  (ZipEntry file in archive)
            {
                file.Extract(SubSetupStream);
            }
        }

问题出在以下几行:

XmlDocument doc = new XmlDocument();
    doc.Load(SubSetupStream);

解决方案是(感谢@Phil):

        if (SubSetupStream.Position>0)
        {
            SubSetupStream.Position = 0;
        }
于 2020-04-07T12:35:31.970 回答