我的代码类似于下面的第一个
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找到这个场景。如果是,那为什么呢?请指出一些文档。
答案 0 :(得分:0)
您所看到的内容已记录在案。
来自XmlNodeList
的文档:
的文档
XmlNodeList
属性和方法返回的节点中反映了创建XmlNodeList
集合的节点对象的子节点立即的更改。
此方法返回的
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;
}
的内容。