Mor*_*sbo 0 c# linq linq-to-xml
我最近开始使用Linq,我目前正在尝试使用它来解析严重嵌套的XML文件(我无法控制).但是,在尝试运行以下语句时,我得到"对象引用未设置为对象的实例"错误.
问题出在"城市"一栏.城市房产的数据来自xml结构前景/ contactinfo/City/Answer.
但由于该字段不是强制性的,因此有时XML不具有城市/答案节点.所以我得到错误,因为"city"节点不存在,我正试图在其上调用".Element()".我找到了很多解决这个问题的方法,当它只有一个节点级别下来时(即如果我需要的数据是在城市中,而城市是唯一缺少的节点).
但是当它降低两级时(即试图得到一个不存在的节点的子节点),我一直无法找到任何解决方案.
希望这个问题足够明确.
最好的问候,莫滕
var prospects = (from prospect in xdoc.Descendants("PROSPECT")
select new Prospect {
ProspectID = (string) prospect.Element("PROSPECTINFO").Element("PROSPECT_ID"),
Name = (string) prospect.Element("PERSONALINFO").Element("FIRSTNAME")+ " " + prospect.Element("PERSONALINFO").Element("SURNAME"),
address = (string) prospect.Element("CONTACTINFO").Element("ADDRESSLINE1").Element("ANSWER"),
zipCode = (string)prospect.Element("CONTACTINFO").Element("POSTALCODE").Element("ANSWER").Value,
City = (string) prospect.Element("CONTACTINFO").Element("CITY").Element("ANSWER"),
}).ToList();
Run Code Online (Sandbox Code Playgroud)
一种选择是使用Elements而不是Element.这是一种扩展方法,可以在单个元素或元素集合中查找所有元素(可选地具有给定名称).因此,如果你反复使用它,如果没有任何匹配,你最终会得到一个0元素的集合.使用FirstOrDefault获得该元素或为空,然后将字符串转换会做你想要什么:
// Still use Element for CONTACTINFO as presumably that's a required element
City = (string) prospect.Element("CONTACTINFO")
.Elements("CITY")
.Elements("ANSWER")
.FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)
这样你就不必编写任何条件代码 - 它只是辍学.
与ChrisF建议的那种检查相比,这最大的优势在于导航路径是否变长.想象一下,路径有6个部分,每个部分都是选项 - 你需要5次检查(首先是"a",然后是"ab",然后是"abc"等),然后是真正的"取物",而在此方案中,您只需Elements为每个新导航链接添加一个额外的调用.