将XmlNodeList转换为XmlNode[]

11

我有一个外部库需要传入一个 "XmlNode[]" 参数,而不是 XmlNodeList。有没有一种直接的方法可以做到这一点,而无需遍历和转移每个节点?

我不想这样做:

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

我正在使用 .NET 2.0,因此需要一种没有使用 Linq 的解决方案。


1
有没有什么原因不迭代 XmlNodeList 并使用它来加载 XmlNode[]?因为如果你这样做了,现在你就已经完成了。 - John Saunders
没有原因,那就是当前的实现。我只觉得很奇怪,为什么不能用更多的编译器语义来完成它呢。 - GrayWizardx
2
编译器语义在较新版本的C#/.NET中已经更新 :) 如果你使用的是旧版本,那么你只能接受当前的情况。 - Zooba
3个回答

20

这个直接的方法怎么样...

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

不需要扩展方法等...


7
OfType 是一个 LINQ 扩展方法。 - vcsjones

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

8
尝试这个(适用于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和IEnumerable(Of T) 2

OP要求不使用Linq的解决方案,而其他答案都使用了它。Shim方法作为扩展方法提供,因此可以重复使用并放置在另一个类中与其他扩展方法一起使用。如果您有不同的要求,应该提出一个新问题。 - Rubens Farias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接