为什么我不能在LINQ-To-XML中选择单个元素?

时间:2010-01-06 20:57:30

标签: c# .net xml linq-to-xml

我有一段时间在我的XML文档中选择单个元素的值

我的文档看起来像

<?xml version="1.0" encoding="utf-8" ?>
<MySettings>
  <AttachmentsPath>Test</AttachmentsPath>
  <PendingAttachmentsPath>Test2</PendingAttachmentsPath>
</MySettings>

我尝试过以下操作:

 XElement mySettings = XElement.Load("MySettings.xml");

 string AttachmentsPath = (from e in mySettings.Descendants("MySettings")
                              select e.Element("AttachmentsPath")).SingleOrDefault().Value;

 XElement mySettings = XElement.Load("MySettings.xml");

     string AttachmentsPath = mySettings.Element("AttachmentsPath").Value;

这些都不起作用。我一直得到:

  

对象引用未设置为   对象的实例。描述:一个   未处理的异常发生在   当前网络的执行   请求。请查看堆栈跟踪   有关错误的更多信息   它起源于代码。

     

异常详细信息:   System.NullReferenceException:Object   引用未设置为的实例   对象

     

来源错误:

     

第33行:
  x =&gt; x.Type);第34行:第35行:
  AttachmentsPath =(来自e in   mySettings.Descendants( “设置”)   第36行:
  选择   e.Element( “AttachmentsPath”))的SingleOrDefault()值。;   第37行:

我可以看到它正确加载到XML文档中。

在尝试访问xml文档中的这个设置值时,我做错了什么?哪种方式正确?

7 个答案:

答案 0 :(得分:3)

由于“MySettings”是根节点,因此它没有名为“MySettings”的后代

 var AttachmentsPath = (from e in mySettings.Descendants("AttachmentsPath")
                               select e).SingleOrDefault().Value;

然而,如果没有节点,SingleOrDefault会返回null,也许您可​​以尝试将其视为更安全

var AttachmentsPathElement = (from e in mySettings.Descendants("AttachmentsPath")
                               select e).SingleOrDefault();

            if(AttachmentsPathElement != null)
            {
                AttachmentsPath = AttachmentsPathElement.Value;
            }

答案 1 :(得分:2)

这很有效。

string path = mySettings.Element("AttachmentsPath").Value;

答案 2 :(得分:1)

这是错误的代码,类的默认值为null,如果返回default,则会得到空引用异常。

SingleOrDefault().Value

其次,如果你的第二种方法不起作用,很可能意味着你无法正确加载XML文件,或者它无法在XML中找到元素“AttachmentsPath”。

 XElement mySettings = XElement.Load("MySettings.xml");
 string AttachmentsPath = mySettings.Element("AttachmentsPath").Value;

答案 3 :(得分:1)

你几乎就在那里,你所要做的就是指定AttachmentPath所在的根元素。

就是这样......

string attachmentsPath= mySettings.Root.Element("MySettings")
                .Elements("AttachmentsPath").SingleOrDefault().Value;

答案 4 :(得分:0)

几小时前我刚刚处理过这样的事情。事实证明,我搜索的元素不存在。您的文档中是否有可能没有名为“设置”的元素?

答案 5 :(得分:0)

为什么要在XElement中加载文档?为什么不XDocument?

你可以试试这个:

XDocument mySettings = XDocument.Load("MySettings.xml");

string AttachmentsPath = mySettings.Root.Element("AttachmentsPath").Value;

答案 6 :(得分:0)

请尝试这种方式。我测试了这段代码的工作正常

  XDocument xmlDoc = XDocument.Load(fileName);

    XElement page = xmlDoc.Descendants("MySettings").FirstOrDefault();

   string AttachmentsPath  =  page.Descendants("AttachmentsPath").First().Value;

   string PendingAttachmentsPath=  page.Descendants("PendingAttachmentsPath").First().Value;