2009-12-11 60 views
8

我有一個外部庫需要一個「XmlNode []」而不是XmlNodeList。有沒有直接的方法來做到這一點,而不需要迭代和傳輸每個節點?將XmlNodeList轉換爲XmlNode []

我不想這樣做:

XmlNode[] exportNodes = XmlNode[myNodeList.Count]; 
int i = 0; 
foreach(XmlNode someNode in myNodeList) { exportNodes[i++] = someNode; } 

我在做這個.NET 2.0,所以我需要在不LINQ的解決方案。

+1

是否有一些原因不會遍歷'XmlNodeList'並使用它來加載'XmlNode []'?因爲如果你這樣做了,你現在就完成了。 – 2009-12-11 23:25:12

+0

沒理由,那是目前的實施。對我來說這似乎很奇怪,它不能用更多的編譯器語義來完成。 – GrayWizardx 2009-12-11 23:29:05

+2

編譯器的語義是在C#/。NET的新版本中:)如果你遇到了一個老版本,那麼你就會陷入你所擁有的。 – Zooba 2009-12-11 23:48:39

回答

7

試試這個(VS2008和目標框架== 2​​.0):

static void Main(string[] args) 
{ 
    XmlDocument xmldoc = new XmlDocument(); 
    xmldoc.LoadXml("<a><b /><b /><b /></a>"); 
    XmlNodeList xmlNodeList = xmldoc.SelectNodes("//b"); 
    XmlNode[] array = (
     new System.Collections.Generic.List<XmlNode>(
      Shim<XmlNode>(xmlNodeList))).ToArray(); 
} 

public static IEnumerable<T> Shim<T>(System.Collections.IEnumerable enumerable) 
{ 
    foreach (object current in enumerable) 
    { 
     yield return (T)current; 
    } 
} 

從這裏提示:IEnumerable and IEnumerable(Of T) 2

+0

@CaTx OP詢問沒有Linq的解決方案,其他答案使用它。 'Shim'方法是作爲擴展方法提供的,所以它可以被重用並且放置在其他擴展方法的類中。如果你有不同的要求,你應該問一個新的問題。 – 2016-06-29 08:58:48

18

這個怎麼樣straightfoward方式...

var list = new List<XmlNode>(xml.DocumentElement.GetElementsByTagName("nodeName").OfType<XmlNode>()); 
var itemArray = list.ToArray(); 

無需擴展方法等...

+7

'OfType'是一個LINQ擴展。 – vcsjones 2011-08-29 16:03:44

7
XmlNode[] nodeArray = myXmlNodeList.Cast<XmlNode>().ToArray();