1

以下の最初のようなコードがあります

String xml1 =
    @"<resultset>
        <result>
            <alamakota />
        </result>
    </resultset>";
String xml2 =
    @"<resultset/>";
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xml1);
XmlNodeList nodes1 = xDoc.SelectNodes("/resultset/result");
xDoc.LoadXml(xml2);
XmlNodeList nodes2 = xDoc.SelectNodes("/resultset/result");
Console.WriteLine(nodes1.Count);
Console.WriteLine(nodes2.Count);

私は、WriteLine メソッドが 1 と 0 を返すことを期待していますが、常にではありません。通常のプログラム実行では double 0 が返されます。また、デバッグ中に 2 番目の SelectNodes にブレークポイントを設定し、VS で nodes1.Count の値をチェックすると、最後に 1 と 0 が返されます。SelectNodes は XmlNodeList の最初のチェック中に評価され、コード内にある行では評価されないようです。たとえば、以下のコードは、実行するたびに 1 と 0 を返します。

String xml1 =
    @"<resultset>
        <result>
            <alamakota />
        </result>
    </resultset>";
String xml2 =
    @"<resultset/>";
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xml1);
XmlNodeList nodes1 = xDoc.SelectNodes("/resultset/result");
Int32 c1 = nodes1.Count;
xDoc.LoadXml(xml2);
XmlNodeList nodes2 = xDoc.SelectNodes("/resultset/result");
Console.WriteLine(nodes1.Count);
Console.WriteLine(nodes2.Count);

最初の SelectNodes の後に xDoc = new XmlDocument() を実行できることはわかっていますが、期待どおりに機能しますが、msdn でこのシナリオが見つからないため、これがどのように機能するのか疑問に思います。はいの場合、なぜですか?いくつかのドキュメントを教えてください。

4

1 に答える 1

0

あなたが見ているものは文書化されています。

のドキュメントからXmlNodeList:

XmlNodeListコレクションの作成元であるノード オブジェクトの子に対する変更は、プロパティとメソッドによって返されるノードにすぐに反映されます。XmlNodeList

そして、ドキュメントからXmlNode.SelectNodes()

このXmlNodeListメソッドによって返されるオブジェクトは有効ですが、基になるドキュメントは変更されません。基になるドキュメントが変更された場合、予期しない結果が返される可能性があります (例外はスローされません)。

xDocそのため、完全に新しい XML で の内容を上書きすると、以前に作成された の内容はXmlNodeListMicrosoft によって定義されなくなります。

于 2016-07-06T07:51:48.070 に答える