LoadXml 和 SelectNodes 的行为

Behavior of LoadXml and 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 上放置断点并在 VS 中检查 nodes1.Count 的值时,它最后会给出 1 和 0。似乎 SelectNodes 是在第一次检查 XmlNodeList 期间评估的,而不是在代码中的行中,例如下面的代码每次都会给出 1 和 0 运行s

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 上找不到这种情况。如果是那么为什么?请指出一些文档。

您所看到的已记录在案。

来自 XmlNodeList 的文档:

Changes to the children of the node object that the XmlNodeList collection was created from are immediately reflected in the nodes returned by the XmlNodeList properties and methods.

以及 XmlNode.SelectNodes()

的文档

The XmlNodeList object returned by this method will be valid while the underlying document remains unchanged. If the underlying document changes, unexpected results may be returned (no exception will be thrown).

因此,当您用全新的 XML 覆盖 xDoc 的内容时,Microsoft 不再定义先前创建的 XmlNodeList 的内容。