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.
的文档
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
的内容。
我有类似于下面第一个的代码
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 theXmlNodeList
properties and methods.
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
的内容。