/ / Zachowanie LoadXml i SelectNodes - c #, xml, .net-3.5, xmldocument, selectnodes

Zachowanie LoadXml i SelectNodes - c #, xml, .net-3.5, xmldocument, selectnodes

Mam kod podobny do pierwszego poniżej

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);

Spodziewałbym się, że metody WriteLine dają 1 i0 ale nie zawsze. W normalnym uruchomieniu programu da podwójne 0. Również podczas debugowania, gdy umieściłem punkt przerwania na drugich SelectNodes i sprawdzeniu wartości węzłów1.Count w VS daje mi 1 i 0 na końcu. Wygląda na to, że SelectNodes jest oceniany podczas pierwszego sprawdzenia XmlNodeList, a nie w linii, gdzie znajduje się w kodzie, na przykład poniższy kod da 1 i 0 przy każdym uruchomieniu

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);

Wiem, że mogę zrobić xDoc = new XmlDocument ()po pierwszym SelectNode i będzie działać tak, jak powinien, ale zastanawiam się, czy tak powinno działać, ponieważ nie mogę znaleźć tego scenariusza w msdn. Jeśli tak, to dlaczego? Proszę wskazać mi jakąś dokumentację.

Odpowiedzi:

0 dla odpowiedzi № 1

To, co widzisz, jest udokumentowane.

Z dokumentacji od XmlNodeList:

Zmiany w obiektach potomnych obiektu węzła, który XmlNodeList kolekcja została utworzona z są natychmiast odzwierciedlone w węzłach zwróconych przez XmlNodeList właściwości i metody.

Oraz z dokumentacji dla XmlNode.SelectNodes()

The XmlNodeList obiekt zwracany przez tę metodę będzie ważny, podczas gdy dokument bazowy pozostanie niezmieniony. Jeśli dokument bazowy ulegnie zmianie, nieoczekiwane wyniki mogą zostać zwrócone (żaden wyjątek nie zostanie zgłoszony).

Tak więc, gdy nadpisujesz zawartość xDoc z całkowicie nowym XML-em, zawartość wcześniej utworzonego XmlNodeList nie są już zdefiniowane przez firmę Microsoft.