【问题标题】:When creating an instance of XmlDocument, why can't I use the SelectSingleNode("String").InnerText more than once? [duplicate]创建 XmlDocument 的实例时,为什么不能多次使用 SelectSingleNode("String").InnerText? [复制]
【发布时间】:2016-06-02 17:27:46
【问题描述】:

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

如果我注释掉 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;
        }

【问题讨论】:

    标签: c# .net xml xmldocument


    【解决方案1】:

    这意味着您的 xml 中没有 Topic2。所以xDoc.SelectSingleNode("Introduction/Topic2") 返回null。当您尝试获取 InnerTextnull 时,您会遇到异常。

    解决方案 - 在获取 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 }
    ]
    

    【讨论】:

    • 感谢您的回复。所以它会测试节点是否不为空,是否有文本字符串。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2019-04-07
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多