>我有类似于下面第一个的代码
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。同样在调试期间,当我在第二个选择节点上放置断点并检查节点 1 的值时。在 VS 中计数,最后给我 1 和 0。似乎 SelectNode 是在第一次检查 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(),它会按预期工作,但我想知道这是否应该这样工作,因为我在 msdn 找不到这种情况。如果是,那为什么?请指出我一些文档。
您所看到的内容已记录在案。
从XmlNodeList
的文档:
对从中创建
XmlNodeList
集合的节点对象的子级所做的更改会立即反映在XmlNodeList
属性和方法返回的节点中。
并从文档中获取XmlNode.SelectNodes()
此方法返回的
XmlNodeList
对象将有效,而基础文档保持不变。如果基础文档发生更改,则可能会返回意外结果(不会引发异常)。
因此,当您使用全新的 XML 覆盖xDoc
的内容时,以前创建的XmlNodeList
的内容不再由 Microsoft 定义。