在创建XmlDocument的实例时,为什么我不能使用SelectSingleNode(" String")。InnerText不止一次?

时间:2016-02-21 08:52:15

标签: c# .net xml xmldocument

编码相当新,不知道我在哪里出错了。应用程序构建但在运行时崩溃并出现错误:"对象引用未设置为对象的实例。"

如果我注释掉test2变量和第二个条件,那么应用程序会按照我的意愿行事。当我取消对上述内容的评论时,我得到了一个例外。

我最终需要为30个复选框构建类似的东西。

非常感谢任何帮助。

XmlDocument xDoc = new XmlDocument();

xDoc.Load(@"\\LEWBWPDEV\\ComplianceXmlStorage\\test.xml");
        string test1 = xDoc.SelectSingleNode("Introduction/Topic1").InnerText;
        string test2 = xDoc.SelectSingleNode("Introduction/Topic2").InnerText;

        if (test1 == "Yes")
        {
            checkBox1.CheckState = CheckState.Checked;
        }
        if (test2 == "Yes")
        {
            checkBox2.CheckState = CheckState.Checked;
        }

1 个答案:

答案 0 :(得分:1)

这意味着您的xml中没有Topic2。因此xDoc.SelectSingleNode("Introduction/Topic2")会返回null。当您尝试获取InnerText null时会出现异常。

解决方案 - 在获取InnerText之前检查null。

  var topic2 = xDoc.SelectSingleNode("Introduction/Topic2");
  if (topic2 != null && topic2.InnerText == "Yes")
      checkBox2.CheckState = CheckState.Checked;

或者您可以使用Null-conditional operator

  string test2 = xDoc.SelectSingleNode("Introduction/Topic2")?.InnerText;

注意:我建议您使用Linq to XML来解析xml

var xdoc = XDocument.Load(fileName);
string test1 = (string)xdoc.XPathSelectElement("Introduction/Topic1");
string test2 = (string)xdoc.Root.Element("Topic2");

您可以将元素转换为某些数据类型(如string或int),如果缺少元素(如果数据类型接受空值),则不会抛出异常。此外,如果您需要处理30个节点,您可以轻松获得所有值:

var topics = from t in xdoc.Root.Elements()
             let name = t.Name.LocalName
             where name.StartsWith("Topic")
             select new {
                 Name = name,
                 IsEnabled = (string)t == "Yes"
             };

此查询将返回xml中所有主题值的集合,您可以使用这些值来设置复选框的状态

[
  { Name: "Topic1", IsEnabled: false },
  { Name: "Topic2", IsEnabled: true }
]