【问题标题】:XPathSelectElement catch null reference exceptionXPathSelectElement 捕获空引用异常
【发布时间】:2021-04-04 23:21:28
【问题描述】:

我正在使用 XPathSelectElement 从 XML 文件中获取一些元素。当 XML 文件中存在这些元素时,它会起作用。如果所选元素不在 XML 中,它自然会引发“空引用”异常。这很好。我希望它能做到这一点。但是,如果 XPathSelectElement 为空,我希望能够捕获该异常并且不执行任何操作。

按预期工作的代码:

public void LoadBonusDescription()
        {
            string Race = CharRaceSelector.Text;
            string bonus = RequirementsBox.Text;

            XDocument doc = XDocument.Load($"{Gamepath}");

            string description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description").Value;
            //DescriptionBox is a listBox
            DescriptionBox.Text = description;

            
        }

我尝试加入 if 声明,例如:

if (description == null)
{
    return;
}
else
{
    DescriptionBox.Text = description;
}

但它并没有命中那部分,并在此处的字符串变量赋值处抛出异常:

string description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description").Value;

如何在变量赋值之前(或期间)捕获异常以运行if 语句?

如果我无法捕捉到它,有没有办法禁用DescriptionBox 列表框而不是将框中的文本变为灰色(就像DescriptionBox.Enabled = false; 一样)? 基本上我想阻止用户选择 XML 文件中不可用的项目。

【问题讨论】:

  • var descriptionElement = doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description"); if(description != null && description.Value != null) { DescriptionBox.Text = description; }
  • 只需使用null conditional operator doc.XPathSelectElement($"...")?.Value;
  • 或者只是在XElement 上使用explicit string cast 而不是明确获取Value(string)doc.XPathSelectElement($"...");
  • @dbc ``` var description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description"); if (description == null) { return; } else { DescriptionBox.Text = description; } 完美运行!谢谢!

标签: c# xml xpath


【解决方案1】:

添加:

var description = (string)doc.XPathSelectElement($"//RaceID[@id='{Race}']/Bonus[@id='{bonus}']/Description");

            if (description == null)
            {
                return;
            }
            else
            {
                DescriptionBox.Text = description;
            }

正如@dbc 建议的那样,它运行良好!

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-02-12
    • 2011-05-05
    • 1970-01-01
    • 2014-10-07
    相关资源
    最近更新 更多