C# 对XML的迭代返回对&;的相同节点;结束

C# 对XML的迭代返回对&;的相同节点;结束,c#,xml,iteration,xmlnode,C#,Xml,Iteration,Xmlnode,下面应该生成所有消息的列表 在实践中,我得到了一个粗略长度的列表,但反复使用相同的元素 Message是从发送给构造函数的XmlNode填充的类 _messages = new List<Message>(); /*This does it*/ foreach (XmlNode n in thread.SelectNodes("//messages/message")) { _messages.Add(new Message(n)); } /*So does this*/ X

下面应该生成所有消息的列表

在实践中,我得到了一个粗略长度的列表,但反复使用相同的元素

Message
是从发送给构造函数的XmlNode填充的类

_messages = new List<Message>();
/*This does it*/
foreach (XmlNode n in thread.SelectNodes("//messages/message"))
{
    _messages.Add(new Message(n));
}
/*So does this*/
XmlNode msgItr = thread.SelectSingleNode("//messages").FirstChild;
while (msgItr != null)
{
    _messages.Add(new Message(msgItr));
    msgItr = msgItr.NextSibling;
}
\u messages=new List();
/*就这样*/
foreach(thread.SelectNodes(“//messages/message”)中的XmlNode)
{
_消息。添加(新消息(n));
}
/*这也一样*/
XmlNode msgItr=thread.SelectSingleNode(//messages”).FirstChild;
while(msgItr!=null)
{
_添加(新消息(msgItr));
msgItr=msgItr.NextSibling;
}

您的路径选择错误,只需使用
//message

这里有两种枚举节点的方法,我使用的是LinqPad,它
Dump()
显示了一种当前状态

XDocument xd = new XDocument(
    new XDeclaration("1.0", "utf-8", "yes"),
    new XElement("Messages",   
         new XElement("Message", "Alpha"),
         new XElement("Message", "Beta"),
         new XElement("Message", "Omega")
  ));

  xd.Descendants("Message").Dump("XDocument");

  XmlDocument xmd = new XmlDocument();

  xmd.LoadXml(xd.ToString());

  xmd.SelectNodes("//Message")
     .Dump("XmlDocument");
下面是第一次和第二次转储的结果


我认为问题不在代码的XML部分。请确保更新文章,其中显示了小的XML示例和演示问题的相对完整的代码版本。旁注:我假设您确实理解XPath中的
“//”
是“从根开始给我所有节点…”,而不是“从当前节点开始给我所有节点…”-这将是一个很好的理由以印刷错误结束。我还建议您检查
SelectNodes
的结果,以确保您实际获得唯一的结果(我希望您会)。如果所有
Message
实例都显示相同,可能是因为它们存储相同的数据,例如在静态字段中?我们需要查看您文档的实例。@AlexeiLevenkov,谢谢。我投票决定关闭,但需要不止一个…使用
//Messages/Message
//Message
之间没有区别。使用您自己的代码,//Messages/Message`将返回与您发布的结果相同的结果