/ / Поведінка LoadXml та SelectNodes - c #, xml, .net-3.5, xmldocument, selectnodes

Поведінка LoadXml та SelectNodes - c #, xml, .net-3.5, xmldocument, selectnodes

У мене є код, подібний до першого нижче

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 але не завжди. У нормальному запуску програми це дасть подвійне 0. Крім того, під час налагодження, коли я встановлюю точку зупинки на другому SelectNodes і перевіряю значення вузлів1.Count в VS це дає мені 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);

Я знаю, що можу зробити xDoc = new XmlDocument ()після першого SelectNodes, і він буде працювати як очікуваний, але я задаюсь питанням, якщо це так, як він повинен працювати, тому що я не можу знайти цей сценарій в MSDN.Якщо так, то чому? Будь ласка, вкажіть мені деяку документацію.

Відповіді:

0 для відповіді № 1

Те, що ви бачите, задокументовано.

З документації від XmlNodeList:

Зміни до дітей об'єкта вузла, що XmlNodeList колекція була створена з негайно відбивається в вершинах вузлів XmlNodeList властивості та методи.

І з документації для XmlNode.SelectNodes()

The XmlNodeList Об'єкт, повернений цим методом, буде дійсним, поки основний документ залишається незмінним. Якщо основний документ змінюється, можуть бути повернені непередбачені результати (без виключення буде викинути).

Отже, коли ви перезаписуєте вміст xDoc з абсолютно новим XML - вмістом раніше створеного XmlNodeList більше не визначаються корпорацією Майкрософт.