编码相当新,不知道我在哪里出错了。应用程序构建但在运行时崩溃并出现错误:"对象引用未设置为对象的实例。"
如果我注释掉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;
}
答案 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 }
]