【问题标题】:C# check XmlNode value attributeC# 检查 XmlNode 值属性
【发布时间】:2015-07-14 23:41:26
【问题描述】:

我编写了这段代码来检查 XmlNode 是否有值,但是当我运行它时,它总是在 !=null 上崩溃。 这很奇怪,因为这个解决方案是众所周知的。

private static void TraverseNodes(XmlNodeList nodes)
{
    foreach (XmlNode node in nodes)
    {

        if (!node.HasChildNodes)
        {
            Console.WriteLine(node.Name + " " + node.Attributes["id"].Value);
        }
        if (node.Attributes["SplitCombinationOperator"].Value != null)
        {
            Console.WriteLine(node.Name + " " + node.Attributes["SplitCombinationOperator"].Value);
        }
        else
        {
            Console.WriteLine(node.Name);
        }

        TraverseNodes(node.ChildNodes);
    }
}

错误如下: 对象引用未设置为对象的实例。

【问题讨论】:

  • SplitCombinationOperator 可能不存在,而您的代码假定“Value”属性在任何情况下都可用。

标签: c# xml


【解决方案1】:

你应该像这样检查空值:

node.Attributes["SplitCombinationOperator"] != null &&
node.Attributes["SplitCombinationOperator"].Value != null

否则,当node.Attributes["SplitCombinationOperator"] 为空时,您将在尝试访问其Value 属性时得到NullReferenceException

【讨论】:

  • 好,现在我明白了。
【解决方案2】:

只需要检查属性索引器本身是否返回null即可:

if (node.Attributes["SplitCombinationOperator"] != null)

目前,它返回 null,并且您正在为 Value 属性取消引用它 - 因此出现异常。请注意,您还假设有一个 id 属性,这可能不是一个好主意。

(您不需要检查Value 本身是否为空 - 如果属性存在,则该值是非空的。即使它为空,您也会得到一个空字符串而不是空引用。)

【讨论】:

  • 我在弄清楚为什么它不起作用,但这个解释很清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多