2015-06-09 44 views
0

以下是应该生成所有消息的列表。通过XML进行迭代返回相同节点Over&Over

在实践中,我得到了一个长度的列表,但是有相同的元素反复。

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; 
} 
+3

我不相信问题是代码的XML部分。请确保更新显示* small * XML样本和演示该问题的相对完整版本的代码。 –

+2

附注:我假设你明白XPath中的“//”'是“从根开始给我所有节点......”,而不是“从当前节点开始给我所有节点......” - 这将是印刷错误关闭的好理由。 –

+0

我也建议你检查'SelectNodes'的结果,以确保你实际得到独特的结果(我希望你会)。如果所有'Message'实例看起来都一样,它们是否可以存储相同的数据,例如在一个静态字段中? –

回答

0

您正在路径错误的位置,请使用//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"); 

这是第一个结果和第二转储

enter image description here

+0

使用'// Messages/Message'和'// Message'没有区别。使用您自己的代码,// Messages/Message'将返回与您发布的结果相同的结果 –