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>

問題は、Web アプリケーションを Chrome または Firefox で開くとエラーは発生しないが、IE 9 で (同じ状態で同じ開発環境で) 使用するとSystem.NullReferenceException: Object reference not set が発生することです。 foreach ループの開始時にオブジェクトのインスタンスに。デバッグ中に、Chrome または FireFox で使用しているときにQuickWatchで oParamCollection の値を確認すると、カウントが 1 になりますが、IE 9 でアプリケーションを使用しているときに値を確認すると、カウントで例外が発生します。とても混乱しています。この問題をインターネットで検索するのにかなりの時間を費やしましたが、今までポインターはありませんでした。SOは私の最後の希望です。前もって感謝します。

4

2 に答える 2

2

何らかの理由で IE9 を使用している場合、これらの属性がすべての場合にあるとは限りません。(あなたは の値を提示したと言っていますが、クライアントが IE9 の場合は、動作している場合と同じではないと強くparamXML思います。それが、コードが失敗する唯一の理由です。)

プロパティを使用する代わりにキャストすることで、問題を隠すことができます。XAttributestringValue

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

これで例外は発生しなくなりますが、または対応する属性が存在しない場合は、null値を持つことに対処する必要があります。NameValue

于 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 文字列に属性名myParammyParamValue小文字が含まれていたのに対し、ここのコードではキャメル ケースでチェックしていたことです。コードで「myparam」と「myparamvalue」を小文字に変更した瞬間、問題は解決しました。私の修正されたコードは次のとおりです。

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

しかし、私の疑問は依然として同じままです.なぜChromeやFFを使用しているときではなく、IEでのみ発生するのですか? SOの立派なメンバーにこれを試してもらい、自分でチェックしてもらいます。

ポインタをくれたJon Skeetに感謝します (+1)。@Jon、私の場合、Value プロパティは属性に対して機能します。値が機能しない可能性があるケースについて言及がある場合は、私と共有してください。ありがとうございました。

于 2012-11-27T05:07:29.913 に答える