处理空XML元素

时间:2017-01-11 14:27:44

标签: c# xml c#-4.0

我正在运行这行代码,它对我的​​大约800条记录执行完美。它达到了创纪录的801,我被抛出

  

未处理的类型' System.NullReferenceException'发生在XMLPost.exe中
附加信息:对象引用未设置为对象的实例。

这是一段麻烦的代码行,我认为在?.Value中添加代码会占用null元素。

string sr12 = xml.Element("Parent").Element("Child1").Element("Child2").Element("Child3").Element("Child4").Element("Child5").Element("sr12")?.Value;
Console.WriteLine(sr12);

我应该为变量sr12更改什么,以便它不会中断,我的代码可以继续按预期执行?

修改

XML结构

<parent>
<one>
    <two>
        <three>
            <sr12></sr12>
        </three>
    </two>
</one>
  <ten>
    <eleven>
        <twelve>
            <thirteen>
                <sr12></sr12>
            </thirteen>
        </twelve>
    </eleven>
  </ten>
</parent>

我也尝试了这种语法

var result = (string) xml.Elements("Parent")
.Elements("ten")
.Elements("eleven")   
.Elements("twelve")
.Elements("thirteen")
.Elements("homeaddress")
.SingleOrDefault();

产生错误

  

未处理的类型&#39; System.InvalidOperationException&#39;发生在System.Core.dll中的附加信息:序列包含多个元素

1 个答案:

答案 0 :(得分:0)

如果您的查询中的任何元素丢失,您将收到此异常。 Element查询返回XElement或返回null

您应该使用Elements查询。这将返回与名称匹配的所有元素,并且可以以相同的方式链接。使用此方法的结果是,如果缺少任何元素,则只需获得一个空序列。

如果您最后调用SingleOrDefault,它将返回查询返回的单个元素或null。然后,您可以使用内置的显式转换为字符串。

var result = (string) xml.Elements("Parent")
    .Elements("Child1")
    .Elements("Child2")   
    .Elements("Child3")
    .Elements("Child4")
    .Elements("Child5")
    .Elements("sr12")
    .SingleOrDefault();

或者,如果绝对路径不重要(可能sr12仅出现在层次结构中的某个点),那么您可以使用Descendants

var result = (string) xml.Descendants("sr12").SingleOrDefault();