【问题标题】:UPdating XML, getting "Object Reference Not Set To An Instance Of An Object"更新 XML,获取“对象引用未设置为对象的实例”
【发布时间】:2016-03-22 00:41:08
【问题描述】:

我正在尝试更新 XML 文档中的 3 条数据,但收到“对象引用未设置为对象实例”错误。这是我要更新的 XML 文件格式:

<?xml version="1.0" encoding="US-ASCII" standalone="true"?>
<ExportSettings xmlns="CompanyName" ExportName="Data Export" Dataset="TestName">
  <General>
     <AsOfDate>03/31/15</AsOfDate>
     <PriceDate>03/31/16</PriceDate>  
  </General>
  <Source>
      <Set>Set Name</Set>
  </Source>
</ExportSettings>

这是引发错误的 C# 代码:

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        try
        {
            {
                string strAsOfDate = dateTimePickerAsOfDate.Text;
                string strPriceDate = dateTimePickerPriceDate.Text;
                string strSetName = txtboxSet.Text;

                XmlDocument doc = new XmlDocument();
                doc.Load(strXMLfilepath);
                XmlNode General;
                XmlNode root = doc.DocumentElement;
                General = root.SelectSingleNode("/ExportSettings/General");
                General["AsOfDate"].InnerText = strAsOfDate;
                General["PriceDate"].InnerText = strPriceDate;
                XmlNode Source;
                Source = root.SelectSingleNode("/ExportSettings/Source");
                Source["Set"].InnerText = strSetName;
                doc.Save(strXMLfilepath);

            }
        }
        catch (System.Exception excep)
        {
            MessageBox.Show(excep.Message);
        }
    }

任何人都可以看到问题吗?我对更新 XML 不是很熟悉,所以这里可能存在一些基本错误。

【问题讨论】:

  • 哪一行抛出异常?您应该能够轻松调试它并查看哪个变量为空。
  • 常规["AsOfDate"].InnerText = strAsOfDate;此外,抛出异常时 strAsOfDate 不为空。
  • 当您在该行放置断点时,“General”变量是否为空?如果不是,那么 "General["AsOfDate]" 失败并返回 null 意味着 .InnerText 将抛出您看到的异常。
  • 您的元素位于 CompanyName 命名空间中,并且您要求的元素不属于任何命名空间。结果,SelectSingleNode 返回 null 并且对该值的任何操作都会导致 NullReferenceException。
  • 好的,所以 General 确实保持为空。调试器跳过“XmlNode General;”行,然后在查看 "General["AsOfDate"].InnerText = strAsOfDate;" 后引发异常

标签: c# .net xml


【解决方案1】:

我已经在本地进行了调试,正如 Pawel 所建议的,您需要对命名空间进行一些更改:

private void btnUpdate_Click(object sender, EventArgs e)
{
    try
    {
        {
            string strAsOfDate = dateTimePickerAsOfDate.Text;
            string strPriceDate = dateTimePickerPriceDate.Text;
            string strSetName = txtboxSet.Text;

            XmlDocument doc = new XmlDocument();
            doc.Load(strXMLfilepath);

            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("ab", "CompanyName");

            XmlNode General;
            XmlNode root = doc.DocumentElement;
            General = root.SelectSingleNode("//ab:General", nsmgr);
            General["AsOfDate"].InnerText = strAsOfDate;
            General["PriceDate"].InnerText = strPriceDate;

            doc.Save(strXMLfilepath);
        }
    }
    catch (System.Exception excep)
    {
        MessageBox.Show(excep.Message);
    }
}

希望这会有所帮助。

【讨论】:

  • 为什么会跳过 XmlNode General;? General 为 null,我认为这是引发错误的原因。
  • XmlNode 通用;只是声明变量。它设置为 General = root.SelectSingleNode("//ab:General", nsmgr);您是否添加了上面的两行新代码并更改了 root.SelectSingleNode("//ab:General", nsmgr);??
  • 是的...我复制并粘贴了您的代码,但在 General["AsOfDate"].InnerText = strAsOfDate;
  • 没关系,问题出在命名空间中,我忘记将某些内容改回真正的 XML 文件的样子。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多