为什么我在这个C#代码中得到格式异常?

时间:2014-07-15 07:18:09

标签: c# xml winforms parsing exception-handling

我正在使用Windows窗体应用程序。我正在解析XML文件并进行一些查询。例如,在这种情况下,我试图找到所有重量在55到100之间的用户。出于某种原因,当我运行此代码时,我得到一个未处理的格式异常。为什么我会收到格式异常。我已经指出了发生异常的断点。我认为问题是语法错误。 谢谢你的帮助。

private bool UserWeighsBetween55and100(IEnumerable<XElement> paramsList) {
    bool result = false;
    foreach (XElement parameter in paramsList) {
        if (parameter.Attribute("name").Value == "Weight") {
  --->HERE     if ((Int32.Parse(parameter.Attribute("value").Value) > 55) &&
                   (Int32.Parse(parameter.Attribute("value").Value) < 100)){
                        return true;
                   }
               }
        }
        return result;
    }

3 个答案:

答案 0 :(得分:1)

转换您的值一次,而不是两次转换相同的值。

尝试这样做。

int iValue = 0;
if (Int.TryParse(parameter.Attribute("value").Value, out iValue)) //If the value converted
{
    if (iValue > 55 && iValue < 100)
    {
        return true;
    }

}
else //Failed to convert value into int datatype
{
    //Code here if conversion faild
}

如果parameter.Attribute("value").Value包含非数字值,则它不会转换为int数据类型。

答案 1 :(得分:0)

而不是使用&#34; Parse&#34;方法,使用tryParse。

在您的情况下,它看起来像:

foreach (XElement parameter in paramsList) {
    if (parameter.Attribute("name").Value == "Weight") {
    int value;
    if(!Int32.TryParse(parameter.Attribute("value").Value, out value)){
         //Not a number, handle this case
    }
    if ((value > 55) &&  (value < 100)){
        return true;
    }
    return result;
}

答案 2 :(得分:0)

我将回答我的问题,因为我发现了我的错误,我希望它能帮助所有人阅读这篇文章。

使用Int32.Parse()的问题在于,在解析XML文件时,我没有注意double类型的值。 此代码的修复程序如下:

private bool UserWeighsBetween55and100(IEnumerable<XElement> paramsList) {
        bool result = false;
        foreach (XElement parameter in paramsList) {
            if (parameter.Attribute("name").Value == "Weight") {
                if ((parameter.Attribute("value").Value)!=null) {
                    if ((Convert.ToDouble(parameter.Attribute("value").Value) > 55) && (Convert.ToDouble(parameter.Attribute("value").Value) < 100)) {
                    return true;
                    }
                }
            }
        }
        return result;
    }