【问题标题】:Can't get XML values using foreach无法使用 foreach 获取 XML 值
【发布时间】:2017-11-20 00:37:45
【问题描述】:

我想使用 foreach 获取 subdata 和 subdata2 值,但由于某种原因,我得到一个空引用异常。

XML:

<project>
<name>Name1</name>
<data>
    <subdata>1</subdata>
    <subdata2>1</subdata2>
</data>
<data>
    <subdata>3</subdata>
    <subdata2>2</subdata2>
</data>
</project>

代码:

XmlNode datanode = doc.DocumentElement.SelectSingleNode("/project/data");
XmlNode innerDataNode;
foreach (XmlNode dataVar in datanode)
{
    innerDataNode = datanode.SelectSingleNode("/subdata");
    int subdataVal = XmlConvert.ToInt16(innerDataNode.InnerText);
    //(...)
}

例外:

System.NullReferenceException: '对象引用未设置为 对象的实例。 innerDataNode 为空。

我做错了什么?

【问题讨论】:

    标签: c# xml nullreferenceexception


    【解决方案1】:

    您不是在节点的当前上下文中搜索。区别只是一个点。所以

    innerDataNode = datanode.SelectSingleNode("/subdata");
    

    应该是:

    innerDataNode = datanode.SelectSingleNode("./subdata");
    

    这是一个小错误,发生在我们很多人身上。但这似乎不是你唯一的错误:

    XmlNode datanode = doc.DocumentElement.SelectSingleNode("/project/data");
    

    只为您提供一个数据节点,并根据您想要所有数据节点的其余代码来判断。所以你必须这样做:

    XmlNodeList datanodes = doc.DocumentElement.SelectNodes("/project/data");
    

    现在你的 foreach 循环是正确的,但是你一直选择 datanode 而不是你应该循环的变量(dataVar)。

    XmlNode innerDataNode;
    foreach (XmlNode dataVar in datanodes)
    {
        innerDataNode = dataVar.SelectSingleNode("./subdata");
        Console.WriteLine(innerDataNode.InnerText);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多