【问题标题】:Root element is missing缺少根元素
【发布时间】:2012-04-24 22:20:39
【问题描述】:

我正在从 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>

你能告诉我哪里出错了。

【问题讨论】:

  • 会不会是没有 XML 声明?
  • 您提供的 xml 代码在 LINQPad 下工作(没有错误)。也许您粘贴的 xml 不是被读取的内容?您确定 doc.Load 可以正常工作并加载您提供的内容吗?
  • 我检查了你的代码,它在我的最后工作正常,你确定你没有得到空 XML?

标签: c# asp.net xml


【解决方案1】:

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

XDocument xDoc = XDocument.Load(xmlStream);  

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

if (xmlStream.Position > 0)
{
    xmlStream.Position = 0;
}
XDocument xDoc = XDocument.Load(xmlStream); 

【讨论】:

  • 谢谢,这有帮助。主要是因为我在序列化之后得到了正确的反序列化,但是在反序列化现有文件时:nada.暗示位置正在偏移,或未在系统后端设置。如果你问我,那是 MS 的一个错误,
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    您好,这是一种奇怪的方法,但请尝试一次

    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); 
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        1. 检查位于 config 文件夹中的 trees.config 文件... 有时(我不知道为什么)这个文件变成空的,就像有人删除里面的内容一样...... 在您的本地 PC 中保留此文件的备份,然后当出现此错误时 - 用您的本地文件替换服务器文件。这就是我在发生此错误时所做的。

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

        祝你好运。

        【讨论】:

        • 您好 Idoshin,赞成第 2 点,因为我们在客户站点看到此错误,而包含 ASP.NET 的 c: 驱动器空间不足,并且 XML 设置文件的内容为此应用程序被清除并因该错误而破坏了应用程序。您是否看到过这种情况,您是否看到过任何将这个问题与磁盘空间不足相关联的“官方”文档?
        【解决方案6】:

        当我试图读取从存档中提取到内存流的 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;
                }
        

        【讨论】:

          猜你喜欢
          • 2016-05-10
          • 2012-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多