2009-12-11 29 views
8

Tôi có một thư viện bên ngoài yêu cầu một "XmlNode []" thay vì XmlNodeList. Có cách trực tiếp để làm điều này mà không cần lặp lại và chuyển mỗi nút?Chuyển đổi XmlNodeList thành XmlNode []

Tôi không muốn làm điều này:

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

tôi đang làm điều này trong .NET 2.0 vì vậy tôi cần một giải pháp mà không LINQ.

+1

có một số lý do không lặp lại trên 'XmlNodeList' và sử dụng nó để tải' XmlNode [] 'không? Bởi vì nếu bạn làm điều đó, bạn sẽ hoàn thành ngay bây giờ. –

+0

Không có lý do, đó là việc thực hiện hiện tại. Nó chỉ có vẻ kỳ lạ với tôi rằng nó không thể được thực hiện với ngữ nghĩa trình biên dịch nhiều hơn nữa. – GrayWizardx

+2

Ngữ nghĩa trình biên dịch cho điều này là trong các phiên bản mới hơn của C# /. NET :) Nếu bạn đang mắc kẹt với một phiên bản cũ hơn, sau đó bạn đang mắc kẹt với những gì bạn đã có. – Zooba

Trả lời

7

Hãy thử điều này (VS2008 và mục tiêu khuôn khổ == 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; 
    } 
} 

gợi ý từ đây: IEnumerable and IEnumerable(Of T) 2

+0

@CaTx OP đã yêu cầu giải pháp không có LINQ và các câu trả lời khác sử dụng nó. Phương thức 'Shim' được cung cấp như một phương thức mở rộng, vì vậy nó có thể được tái sử dụng và được đặt trong một lớp khác với các phương thức mở rộng khác. Nếu bạn có các yêu cầu khác nhau, bạn nên hỏi một câu hỏi mới. –

18

Làm thế nào về cách straightfoward này ...

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

Không cần phương thức mở rộng, v.v ...

+7

'OfType' là phần mở rộng LINQ. – vcsjones

7
XmlNode[] nodeArray = myXmlNodeList.Cast<XmlNode>().ToArray(); 
Các vấn đề liên quan