当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_1 Value1_2 Value2_1 Value2_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]; } }