【问题标题】:Handle Null XML Element处理空 XML 元素
【发布时间】:2017-05-26 09:30:33
【问题描述】:

我正在运行这行代码,它完美地执行了我大约 800 条记录。创纪录的801,我被扔了

XMLPost.exe 中出现“System.NullReferenceException”类型的未处理异常

其他信息:对象引用未设置为对象的实例。

这是麻烦的代码行,我认为在?.Value 中添加它会解释空元素。

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();

这会产生错误

System.Core.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:序列包含多个元素

【问题讨论】:

  • 如果任何其他 Element("xx") 元素为空怎么办?您只需检查 Element("sr12") 是否为空。
  • 不要使用值:string sr12 = (string)xml.Element("Parent").Element("Child1").Element("Child2").Element("Child3")。 Element("Child4").Element("Child5").Element("sr12");
  • @Nebr - 我使用 ?.Value;对于我试图用我的 XML 返回的所有元素 - 这是唯一一个引发错误的元素
  • @Charles Mager 的回答将解决您的问题。您确定每次抛出错误是同一个字段还是不同的字段?同样,提供的代码将解决您的问题。

标签: c# xml c#-4.0


【解决方案1】:

如果查询中的 any 元素缺失,您将收到此异常。 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();

【讨论】:

  • 我收到此错误 - “XElement”不包含“SingleOrDefault”的定义,并且找不到接受“XElement”类型的第一个参数的扩展方法“SingleOrDefault”
  • @ToastedBreadLeavesYouDead 听起来您仍在调用Element 而不是Elements。注意末尾的 s
  • 好收获。我更改为 Elements,现在收到错误 System.Core.dll 中发生“System.InvalidOperationException”类型的未处理异常附加信息:序列包含多个元素
  • @ToastedBreadLeavesYouDead 在这种情况下,您的查询会返回多个名为 sr12 的元素。您可以使用FirstOrDefault 获得第一个。如果不知道您的 XML 是什么样子或您的具体用例是什么,就很难给出准确的建议。
  • 查看我的编辑 - 我想我现在正在提供您需要查看的 XML 结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多