LoadXml和SelectNodes的行为

时间:2016-07-06 07:26:20

标签: c# xml .net-3.5 xmldocument 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

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找到这个场景。如果是,那为什么呢?请指出一些文档。

1 个答案:

答案 0 :(得分:0)

您所看到的内容已记录在案。

来自XmlNodeList的文档:

  

XmlNodeList属性和方法返回的节点中反映了创建XmlNodeList集合的节点对象的子节点立即的更改。

来自XmlNode.SelectNodes()

的文档
  

此方法返回的xDoc对象在基础文档保持不变时有效。 如果基础文档发生更改,则可能会返回意外结果(不会抛出任何异常)。

因此,当您使用全新的XML覆盖XmlNodeList的内容时,Microsoft不再定义先前创建的 public string bearer; GoogleCredential credential; string fichero = Server.MapPath("") + "//file.json"; using (Stream stream = new FileStream(fichero, FileMode.Open, FileAccess.Read, FileShare.Read)) { credential = GoogleCredential.FromStream(stream); } credential = credential.CreateScoped(new[] { "https://www.googleapis.com/auth/analytics.readonly" }); try { Task<string> task = ((ITokenAccess)credential).GetAccessTokenForRequestAsync(); task.Wait(); bearer = task.Result; } catch (AggregateException ex) { throw ex.InnerException; } 的内容。