c#linq xml属性不存在

时间:2016-07-18 17:29:22

标签: c# xml linq

我正在尝试读取xml文件并获取属性,但有时此属性不存在。

当它不存在时,我收到此错误:

  

System.Linq.Enumerable + WhereSelectEnumerableIterator 2[System.Xml.Linq.XElement,<>f__AnonymousType0 2 [System.String,System.String]]

并且:

  

严重错误:System.NullReferenceException:....

我的代码:

string url = @"http://vigilance.meteofrance.com/data/NXFR33_LFPW_.xml";

XDocument doc = XDocument.Load(url);
var selectedBook = from r in doc.Descendants("DV")
                          .Where(r => (string)r.Attribute("dep").Value == Departement)
                           select new
                           {
                               Color = r.Attribute("coul").Value,
                               Risque = (string) r.Element("risque").Attribute("val").Value,
                           };

XML看起来像这样:

<DV dep="02" coul="1"/>
<DV dep="03" coul="3">
    <risque val="6"/>
</DV>

有没有人有想法?

2 个答案:

答案 0 :(得分:0)

试试这个

            XDocument doc = XDocument.Load(url);
            var selectedBook = doc.Descendants("DV")
                               .Where(r => (string)r.Attribute("dep") == Departement)
                               .Select(r => new {
                                   Color = r.Attribute("coul").Value,
                                   Risque = r.Element("risque") == null ? null : (string)r.Element("risque").Attribute("val").Value,
                               }).ToList();

答案 1 :(得分:0)

问题是某些ggtern元素没有子DV元素,因此在查询的这一部分中:

risque

Risque = (string) r.Element("risque").Attribute("val").Value 将返回Element,当您尝试拨打null时,您会收到空引用异常。

您可以通过不从序列到单个项目直到结束,并使用从元素和属性到基本类型(如Attribute)的显式转换来解决此问题。这样,将null属性从attribute转换为string将只返回null。

string

有关正常工作的演示,请参阅this fiddle