У мене є код, подібний до першого нижче
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
більше не визначаються корпорацією Майкрософт.