2011-02-16 93 views
1

Visual Studio 2010,Silverlight 4和C#。我将以下数据存储在XML文件中:使用LINQ,多个具有相同名称的元素读取XML数据

<root> 
     <element>TextHere</element> 
     <element>TextHere</element> 
     <element>TextHere</element> 
</root> 

这是我当前的代码。

XDocument xmlDoc = XDocument.Load("XMLDocument.xml"); 
var ElementsList = from Elements in xmlDoc.Descendants("root") 
        select new 
        { 
         ElementContent = Elements.Element("Element").Value, 
        }; 

该代码仅将列表中的第一个元素放在列表中,而将所有其他元素排除。我该如何重写这段代码才能捕获XML文件中所有名为“element”的元素?

回答

5

这将做到这一点:

XDocument xmlDoc = XDocument.Load("XMLDocument.xml"); 
var ElementsList = from Elements in xmlDoc.Descendants("element") 
        select new 
        { 
         ElementContent = Elements.Value 
        }; 

还是多了几分简洁圆点分隔:

var ElementsList = xmlDoc.Descendants("element") 
         .Select(x => new { ElementContent = x.Value }); 

不过请注意,你只能有元素在此之后的枚举,如果你想有一个列表(如您的变量名称所暗示的),你可以选择后添加.ToList()

var ElementsList = xmlDoc.Descendants("element") 
         .Select(x => new { ElementContent = x.Value }) 
         .ToList(); 

这将列出将包含3个元素(基于您的示例XML。 )具有ElementContent属性的匿名类型。如果不需要该属性(我想你不)这是只返回字符串列表的简化版本:

var ElementsList = xmlDoc.Descendants("element") 
         .Select(x => x.Value) 
         .ToList(); 
+0

好,成功地拉动了所有元素,然而它将它们全部放在一个字符串中,没有明显的分离方式。我需要将每个元素的内容作为列表中的单独项目。这可能吗? – BCXtreme 2011-02-16 03:29:37

2

这将做它 -

XDocument xmlDoc = XDocument.Load("XMLDocument.xml"); 
var ElementsList = from Elements in xmlDoc.Descendants("root") 
select new 
{ 
    Element1 = (string)Elements.Element("element"), 
    Element2 = Elements.Element("element").ElementsAfterSelf("element").First().Value, 
    Element3 = Elements.Element("element").ElementsAfterSelf("element").ElementAt(1).Value, 
}; 
相关问题