为什么我在XElement.Load(...)上抛出异常?

时间:2014-04-30 21:00:05

标签: c#

我正在通过教学视频。这应该是执行简单的代码,并在下面列出了简单的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>

2 个答案:

答案 0 :(得分:0)

运行代码会给我一个错误:

  

未处理的类型&#39; System.Xml.XmlException&#39;发生在System.Xml.dll

中      

其他信息:系统不支持&#39; utf-8?&#39;编码。第1行,第31位。

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

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

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

现在再次运行代码会导致出现另一个错误:

  

未处理的类型&#39; System.Xml.XmlException&#39;发生在System.Xml.dll

中      

其他信息:&#39; acc&#39;第4行第4位的开始标记与&#39; account&#39;的结束标记不匹配。第4行,第24位。

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

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

这将允许您成功构建和运行程序,为您提供预期的输出。

如果现在您的例外是找不到该文件,则需要将程序中的路径(如果使用Visual Studio)更改为:

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

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

答案 1 :(得分:-1)

您的XML格式不正确,请在此处查看:

http://www.xmlvalidation.com