缺少根元素
本文关键字:元素 | 更新日期: 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文件必须有一个包含所有其他元素的根元素/节点。
这是奇怪的方式,但请尝试一次
- 将文件内容读入字符串
- 打印字符串并检查您是否获得了正确的XML
- 您可以使用
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 这样的嗅探器正确下载。
我编写了一个快速控制台应用程序来运行您的代码并解析文件,它对我来说效果很好。
-
检查位于配置文件夹中的 trees.config 文件...有时(我不知道为什么)这个文件变得空了,就像有人删除里面的内容一样......在本地PC中备份此文件,然后在出现此错误时 - 将服务器文件替换为本地文件。这就是发生此错误时我所做的。
-
检查服务器上的可用空间。有时这就是问题所在。
祝你好运。
当我尝试读取从存档中提取到内存流的 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
.