XElement迭代并将其添加到父级

时间:2012-11-08 13:42:25

标签: c# .net xml xml-parsing

嗨我有以下问题...请帮忙,因为我对C#编程很陌生,没有以前的编程经验......

在我的代码中,我想在Xml文件中迭代XElement将Xelement添加到称为Capability的父级....这是我的代码......

if (xElem.HasElements)
        {

            foreach (XElement xChild in xElem.Element("Elements"))
            {
                Capability capChild = Parse(xChild);
                capParent.Children.Add(capChild);
            }
        }

这里foreach循环给出错误

  

错误32 foreach语句无法对'System.Xml.Linq.XElement'类型的变量进行操作,因为'System.Xml.Linq.XElement'不包含'GetEnumerator'的公共定义........

如何执行查找XElement是否有任何子项并将其添加到父级功能的功能?

2 个答案:

答案 0 :(得分:4)

首先修复,添加's':

//foreach (XElement xChild in xElem.Element("Elements"))
  foreach (XElement xChild in xElem.Elements("Elements"))

这假设在xElem下的XML中有一个或多个标记<Elements>

答案 1 :(得分:2)

Henk的答案应该有效,但我个人会使用

    foreach (XElement xChild in xElem.Descendants())

其中xElem等于您想要所有子元素的父元素。或者您也可以使用LINQ查询基本完成相同的任务

    var children =
       from xChild in xElem.Descendants()
       select Parse(xChild)

应该返回一个IEnumerable,你可以循环并以这种方式添加。

编辑:

我刚刚意识到你说你是C#的新手而没有以前的编程经验。我认为你理解为什么抛出这个错误也很重要。在C#中为了使用foreach循环,集合必须实现IEnumerable。这样,集合类型可以定义枚举数据的方式。 XElement不可枚举,因为它意味着表示单个元素,而不是元素集合。因此,使用xElem.Element(“ElementName”)意味着返回单个结果,而不是数组或集合。使用xElem.Elements(“ElementName”)将返回与XName匹配的所有XElements的集合。但是,如果您想要单个元素的所有子元素而不管名称,那么这就是xElem.Descendants()的用武之地。您使用哪一个取决于您需要的数据以及添加方式。