我试图读取一个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>
有人有主意吗?
问题是一些DV
元素没有子risque
元素,因此在查询的这一部分中:
Risque = (string) r.Element("risque").Attribute("val").Value
Element
将返回null
,当您尝试调用Attribute
时,您将获得一个空引用异常。
您可以通过使从序列到单个项直到结束,并使用从元素和属性到基本类型(如string
)的显式转换来解决此问题。这样,为null属性从属性转换为字符串只会返回null。
Risque = (string) r.Elements("risque").Attributes("val").SingleOrDefault()
看看这个小提琴的工作演示。
试试这个
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();