为什么我在XElement上抛出异常.加载(..)

本文关键字:加载 抛出异常 XElement 为什么 | 更新日期: 2023-09-27 18:01:06

我正在制作一段教学视频。这应该是一个简单的代码来执行并显示下面列出的一个简单XML。在视频中,您可以看到代码运行良好,并在一个简单的DOS框中显示XML。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace XMLPROC
{
    class Program
    {
        static void Main(string[] args)
        {
            var doc = XElement.Load("acct.xml");
            var qry = from ele in doc.Elements("acc")
                      select ele;
            foreach (var ele in qry)
            {
                Console.WriteLine("Account --> " + ele);
            }
            Console.WriteLine(">>>>>> Name Space Section <<<<<<");
            var doc2 = XElement.Load("acct2.xml");
            var qry2 = from ele in doc2.Elements("{urn:accounting}accounts")
                       select ele;
            Console.ReadKey();
        }
    }
}

XML 1:

<?xml version="1.0" encoding="utf-8" ?>
<accounts>
  <acc name="AC1">100</account>
  <acc name="AC2">200</account>
  <acc name="AC3">300</account>
  <acc name="AC4">400</account>
  <acc name="AC5">500</account>
  <acc name="AC6">600</account>
  <acc name="AC7">700</account>
  <acc name="AC8">800</account>
  <acc name="AC9">900</account>
</accounts>

XML 2:

<?xml version="1.0" encoding="utf-8" ?>
<accounts xmlns="urn:accounting">
  <acc name="AC1">100</account>
  <acc name="AC2">200</account>
  <acc name="AC3">300</account>
  <acc name="AC4">400</account>
  <acc name="AC5">500</account>
  <acc name="AC6">600</account>
  <acc name="AC7">700</account>
  <acc name="AC8">800</account>
  <acc name="AC9">900</account>
</accounts>

---新的工作XML——

<?xml version="1.0" encoding="utf-8" ?>
<accounts>
  <acc name="">100</acc>
  <acc name="">200</acc>
  <acc name="">300</acc>
  <acc name="">400</acc>
  <acc name="">500</acc>
  <acc name="">600</acc>
  <acc name="">700</acc>
  <acc name="">800</acc>
  <acc name="">900</acc>
</accounts>
-------
<?xml version="1.0" encoding="utf-8" ?>
<accounts xmlns="urn:accounting">
  <acc name="">100</acc>
  <acc name="">200</acc>
  <acc name="">300</acc>
  <acc name="">400</acc>
  <acc name="">500</acc>
  <acc name="">600</acc>
  <acc name="">700</acc>
  <acc name="">800</acc>
  <acc name="">900</acc>
</accounts>
-------
<?xml version="1.0" encoding="utf-8" ?>
<bad-accounts>
  <acc name="">9</acc>
</bad-accounts>

为什么我在XElement上抛出异常.加载(..)

运行代码会出现错误:

类型为"System"的未处理异常。Xml。系统中出现XmlException。Xml.dll

附加信息:系统不支持"utf-8?"编码。第1行,位置31。

这表明您的XML格式有问题,特别是在编码方面。查看您的encoding标记,您可以注意到您的编码实际上应该设置为encoding="utf-8",但您也包含了XML标记结束时的 ?

因此,修复这两个XML文档中的编码,如下所示:

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

现在再次运行您的代码会导致另一个错误发生:

类型为"System"的未处理异常。Xml。系统中出现XmlException。Xml.dll

附加信息:第4行第4位的"acc"起始标记与"account"的结束标记不匹配。第4行,位置24。

这意味着您的标记必须无效。查看您的帐户标记,您会发现您使用<acc name="">打开,并尝试使用</account>关闭。这些必须是一致的。所以像这样修复每一行:

<acc name="">value</acc>

这将使您能够成功地构建和运行程序,为您提供预期的输出。

如果您现在的异常是找不到文件,则需要将程序中的路径(如果使用Visual Studio(更改为以下路径:

var doc = XElement.Load("../../acct.xml");

该路径是到XML文件可能所在的基本文件夹的相对路径。根据需要对此进行调整,或为其提供文件的完整路径。