缺少根元素

本文关键字:元素 | 更新日期: 2023-09-27 18:30:58

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

我读取 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>

你能说出我哪里出错了吗?

缺少根元素

以防万一其他人从谷歌登陆这里,我在使用 XDocument.Load(Stream) 方法时被这条错误消息咬了一口。

XDocument xDoc = XDocument.Load(xmlStream);  

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

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

确保 XML 如下所示:

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

此外,正如 https://landesk378.rssing.com/chan-11533214/article34.html 所指出的——

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

嗨,

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

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

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

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

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

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

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

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

就我而言,我发现应用程序设置已损坏。因此,要解决它,只需删除本地应用程序数据中的文件夹 %appdata%/../Local/YOUR_APP_NAME .