当XElements具有相同名称时,如何使用LINQ查询来获取XElement值

我有一块像下面这样的xml:

  Value1_1 Value1_2   Value2_1 Value2_2  

我想要的是一个LINQ查询,它生成一个IEnumerable,我可以将其指定为DataGrid的数据源。 到目前为止我所拥有的内容如下:

 var temp = from record in table.Elements("Record") select record.Element("Field").Value 

我可以拥有多个场元素的事实是我的绊脚石。

在上面的例子中,我需要的是像IEnumerable 。 datagrid看起来像这样:

 Value1_1, Value1_2 Value2_1, Value2_2 

这样的事情有帮助吗?

 var a = from record in table.Elements("Record") select new { one = (string)record.Elements().ElementAt(0), two = (string)record.Elements().ElementAt(1) }; 

听起来你想要对字段进行非规范化,使其适合数据网格中的1列。

以下是否有帮助?

 var table = XElement.Parse(@"Value1_1Value1_2Value2_1Value2_2
"); var temp = from record in table.Elements("Record") from field in record.Elements("Field") group field.Value by record into groupedFields select groupedFields.Aggregate((l, r) => l + ", " + r); foreach (var row in temp) Console.WriteLine(row); Console.ReadKey();

免责声明:我不再做SQL或LINQ了,所以这可能会更好。 随意改变它。

我不知道问题是什么以及为什么这些答案看起来很复杂: – /这是我的产品:

 var r = (from record in table.Elements("Record") select (from element in record.Elements("Field") select element.Value)); // => IEnumerable> 

内部IEnumerable用于列,外部用于行。 (问题有点令人困惑,因为没有IEnumerable ,上面是我对意图的改编。)

你可以将内部IEnumerable变成一个字符串(例如Join on“,”),但是如果你将值表示为列,那么放入网格并不是很有趣!

 var r = (from record in table.Elements("Record") select String.Join(", ", record.Elements("Field").Select(f => f.Value).ToArray()); // => IEnumerable 

如果我真的知道LINQ表达式,上面的内容可能会更好。 但是,它可以工作并涵盖“其他”案例 – “ToArray”适用于.NET 3.5及更低版本。

也许这个?

 using System.Linq; using System.Xml.Linq; using System.Collections.Generic; using System.Diagnostics; [TestMethod] public void Linq_XElement_Test() { string xml = @" Value1_1 Value1_2  Value2_1 Value2_2 
"; XElement elements = XElement.Parse(xml); var qryRecords = from record in elements.Elements("Record") select record; foreach (var rec in qryRecords) { Debug.WriteLine(rec.Value); } var qryFields = from record in elements.Elements("Record") from fields in record.Elements("Field") select fields; foreach (var fil in qryFields) { Debug.WriteLine(fil.Value); } IEnumerable list = qryFields.Select(x => x.Value); foreach (string item in list) { Debug.WriteLine(item); } }

您可以链接到Elements()调用:

 var temp = from field in table.Elements("Record").Elements("Field") select field.Value; 

你也可以使用Descendants()

  var temp = from field in table.Descendants("Field") select field.Value; 

但是,这将返回

下的所有元素,即使它们不在元素中。

您需要两个步骤:

注释记录(代替属性),然后枚举字段并将值传递给匿名类进行绑定,如下所示:

 string xml = [string-goes-here]; XElement elem = XElement.Parse(xml); int count= 0; foreach(XElement recordElems in elem.Elements("Record")){ recordElems.SetAttributeValue("id", count); count++; } var temp = from record in elem.Elements("Record") from field in record.Elements("Field") select new { Record = "Record " + record.Attribute("id").Value, Field = field.Value }; foreach (var item in temp) { Console.WriteLine("{0}: {1}", item.Record, item.Field); } } 

我可能想要找你想要的东西,但是你在找这样的东西吗?

  DataSet ds = new DataSet("Records DS"); ds.Tables.Add("Records"); foreach (XElement record in table.Descendants("Record")) { var temp = from r in record.Descendants("Field") select r.Value; string[] datum = temp.ToArray(); if (datum != null && datum.Length > 0) { foreach (string s in datum) ds.Tables[0].Columns.Add(); DataRow row = ds.Tables[0].NewRow(); row.ItemArray = datum; ds.Tables[0].Rows.Add(row); } } 

然后返回ds并将DataMember设置为"Records"

呃……我认为你正在使用错误的LINQ范例来解决这个问题。 您应该使用LINQ to XML,这可能与您期望的略有不同。

看看这个链接:

http://msdn.microsoft.com/en-us/library/bb308960.aspx

它使用与您呈现的结构类似的示例来解释它。

会的吗?

 IEnumerable> 

工作? (不知道如何让它显示为内联)

 var recordList = from record in data.Elements("record") select record; List> x = new List>(recordList.Count()); foreach (var record in recordList) { var z = from field in record.Elements("field") select field.Value; x.Add(z.ToList()); } return x.AsEnumerable(); 

不知道这是否适用于您的特定情况。

var detail1 =来自d的ds.tbl_Looking_Fors,其中d.Profile_ID == id选择d.Looking_For;

  string[] datum = detail1.ToArray(); if (datum != null && datum.Length > 0) { foreach (var row in datum) { Label6.Text = datum[0]+" , "+datum[1]; } }