【问题标题】:Null Reference exception when parsing this XML (C# code included)解析此 XML 时出现空引用异常(包括 C# 代码)
【发布时间】:2014-01-22 01:30:33
【问题描述】:

我正在尝试熟悉使用 C# 解析 XML 文档。我的 XML 文件如下所示:

<title>
  <titledata titletype="standard">
    <currentid>18097</currentid>
  </titledata>
  <resourcedata>
    <resource id="36" resourcetype="image">
        <name>nextBtn.gif</name>
        <relativelink>images/nextBtn.gif</relativelink>
        <resourceflags>0</resourceflags>
        <lastupdated>1367612131</lastupdated>
    </resource>
    <resource id="37" resourcetype="image">
        <name>nextOver.gif</name>
        <relativelink>images/nextOver.gif</relativelink>
        <resourceflags>0</resourceflags>
        <lastupdated>1367612131</lastupdated>
    </resource>
    <resource id="38" resourcetype="image">
        <name>nextDown.gif</name>
        <relativelink>images/nextDown.gif</relativelink>
        <resourceflags>0</resourceflags>
        <lastupdated>1367612131</lastupdated>
    </resource>
  <resourcedata>
</title>

我的代码如下所示:

private void button1_Click(object sender, EventArgs e)
    {
        var ofd = new OpenFileDialog { Filter = "XML|*.xml" };
        if (ofd.ShowDialog() != DialogResult.OK) return;

        var xdoc = XDocument.Load(ofd.FileName);

        foreach (var element in xdoc.Descendants("resourcedata"))
        {
            var id = Convert.ToInt32(element.Attribute("id").Value);
            var resourceType = element.Attribute("resourcetype").Value;
            var name = element.Element("name").Value;
            var relativeLink = element.Element("relativeLink").Value;
            var resourceFlag = Convert.ToInt32(element.Element("resourcetype").Value);
            var lastUpdated = Convert.ToInt32(element.Element("lastupdated").Value);
            resourceFlag, lastUpdated);

            textBox1.Text += "ID: " + id + "\r\n";
            textBox1.Text += "Resource Type: " + resourceType + "\r\n";
            textBox1.Text += "Name: " + name + "\r\n";
            textBox1.Text += "Relative Link: " + relativeLink + "\r\n";
            textBox1.Text += "Resource Flag: " + resourceFlag + "\r\n";
            textBox1.Text += "Last Updated: " + lastUpdated + "\r\n";

        }
    }

我得到的错误是以下行中的“Null Reference Exception”:

var id = Convert.ToInt32(element.Attribute("id").Value);

这几乎就像我当时试图访问错误的元素一样,因为属性id 似乎不存在。如果是这种情况,我需要做什么来修复我的代码?我只是想打印 XML 文件中每个 resource 的信息。

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    将您的 foreach 来源更改为:

    foreach (var element in xdoc.Descendants("resourcedata").Elements("resource"))
    

    否则,您将遍历没有名为 id 的属性的 &lt;resourcedata&gt; 元素。

    PS。如果文件看起来像您向我们展示的那样,您也可以尝试以下操作:

    foreach (var element in xdoc.Root.Element("resourcedata").Elements("resource"))
    

    应该比使用Descendants 稍快。

    【讨论】:

    • 啊哈!缺失的部分。你找到了!非常感谢!时间一到,我会标记答案。感谢您的帮助!
    猜你喜欢
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多