根元素缺失

时间:2012-04-12 14:35:35

标签: c# asp.net xml

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

请告诉我哪里出错了。

6 个答案:

答案 0 :(得分:53)

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

XDocument xDoc = XDocument.Load(xmlStream);  

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

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

答案 1 :(得分:11)

确保XML看起来像这样:

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

  1. 将文件内容读入字符串
  2. 打印字符串并检查您是否获得了正确的XML
  3. 您可以使用XMLDocument.LoadXML(xmlstring)
  4. 我尝试使用您的代码和相同的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");
            }
    

    它工作得很好

答案 4 :(得分:1)

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

答案 5 :(得分:0)

  1. 检查位于config文件夹中的trees.config文件... 有时(我不知道为什么)这个文件变得空洞,就像有人删除里面的内容一样...... 在本地PC中保留此文件的备份,然后出现此错误时 - 将服务器文件替换为本地文件。这是我在发生此错误时所做的事情。

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

  3. 祝你好运。