0

我正在用 ASP.NET (C#) 开发一个 web 应用程序,下面的代码片段是函数的一部分:

string[] paramList = new string[2];
string[] paramValList = new string[2];

XDocument doc = XDocument.Parse(paramXML);
var oParamCollection = from parameters in doc.Descendants("myfunction")
          select new
          {
          Name = parameters.Attribute("myParam").Value,
          Value = parameters.Attribute("myParamValue").Value
          };

int i=0;
foreach (var oParam in oParamCollection)
{
    string name = oParam.Name.Trim();
    string value = oParam.Value.Trim();

    paramList[i] = oParam.Name.Trim();
    paramValList[i++] = oParam.Value.Trim();

    if (i >= 2)
    break;
}

以下是在 3 代码行中使用的 paramXML 变量(参数)的值:

<root><myfunction myparam=" DeliveryDate" myparamvalue="2012-07-01" ></myfunction></root>

现在的问题是,当我在 Chrome 或 Firefox 中打开我的网络应用程序时,没有错误,但是当我在 IE 9 中使用它时(在相同的状态和相同的开发环境中),我得到System.NullReferenceException: Object reference not set到foreach 循环开始时的对象实例。在调试时,我在 Chrome 或 FireFox 中使用时检查了QuickWatch中的 oParamCollection 的值,我得到的计数为 1,但是当我在 IE 9 中使用应用程序时检查该值时,计数给出了异常。我很困惑。花了很长时间在互联网上搜索这个问题,但直到现在还没有指针。所以是我最后的希望。先感谢您。

4

2 回答 2

2

我怀疑由于某种原因在使用 IE9 时,您在所有情况下都没有这些属性。(您说您已经提供了 的值paramXML,但我强烈怀疑客户端是 IE9 时它与工作案例中的值不同。这是您的代码失败的唯一原因。)

您可以通过转换为而不是使用属性来隐藏问题:XAttributestringValue

var oParamCollection = from parameters in doc.Descendants("spparam")
                       select new
                       {
                           Name = (string) parameters.Attribute("myParam"),
                           Value = (string) parameters.Attribute("myParamValue")
                       };

现在您不会遇到异常...但是您将不得不处理具有nullNameValue相应属性不存在的情况。

于 2012-11-26T10:33:33.697 回答
0

经过大量调试,我终于找到了解决方案。问题肯定出在问题中提到的代码片段中(由于我的愚蠢错误)。有问题的代码如下:

            var oParams = from parameters in l_oXDoc.Descendants("myfunction")
                          select new
                          {
                              //Name = (string) parameters.Attribute("myParam"),
                              //Value = (string) parameters.Attribute("myParamValue")
                              Name = parameters.Attribute("myParam").Value,
                              Value = parameters.Attribute("myParamValue").Value
                          };

问题是 XML 字符串具有属性名称myParam并且myParamValue是小写的,而在代码中我检查的是驼峰式大小写。当我将代码中的“myparam”和“myparamvalue”更改为小写时,问题就解决了。我的纠正代码如下:

            var oParams = from parameters in l_oXDoc.Descendants("myfunction")
                          select new
                          {
                              Name = parameters.Attribute("myparam").Value,
                              Value = parameters.Attribute("myparamvalue").Value
                          };

但我的疑问仍然存在,为什么它只发生在 IE 上而不是在使用 Chrome 或 FF 时发生?我要求 SO 的可敬成员尝试此操作并自行检查。

我要感谢Jon Skeet给我指点(+1 给你)。@Jon,就我而言, Value 属性适用于属性。如果您对价值可能不起作用的情况有任何参考,请与我分享。谢谢你。

于 2012-11-27T05:07:29.913 回答