2015-06-09 66 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'將返回與您發佈的結果相同的結果 –