如果您想使用此Xml库,您可以使用以下代码获取所有学生及其详细信息:
XElement root = XElement.Load(file); // or .Parse(string)
var students = root.Elements("student").Select(s => new
{
Name = s.Get("Detail/Name", string.Empty),
Class = s.Get("Detail/Class", string.Empty),
Items = s.GetElements("Detail/add").Select(add => new
{
Key = add.Get("key", string.Empty),
Value = add.Get("value", string.Empty)
}).ToArray()
}).ToArray();
然后要迭代它们,请使用:
foreach(var student in students)
{
Console.WriteLine(string.Format("{0}: {1}", student.Name, student.Class));
foreach(var item in student.Items)
Console.WriteLine(string.Format(" Key: {0}, Value: {1}", item.Key, item.Value));
}
您可以使用 Linq Select 和 string.Join 来获得您想要的输出。
string.Join(Environment.NewLine,
elem.Attributes.ToObjectArray()
.Select(a => "Name=" + a.Name + ", Value=" + a.Value)
)
这将获取您在问题中所述的 Detail 元素的子元素的所有属性。
XDocument x = XDocument.Parse("<Students> <student> <Detail Name=\"abc\" Class=\"1st Year\"> <add key=\"Main\" value=\"web\"/> <add key=\"Optional\" value=\"database\"/> </Detail> </student> </Students>");
var attributes = x.Descendants("Detail")
.Elements()
.Attributes()
.Select(d => new { Name = d.Name, Value = d.Value }).ToArray();
foreach (var attribute in attributes)
{
Console.WriteLine(string.Format("Name={0}, Value={1}", attribute.Name, attribute.Value));
}
如果您在 object[]
中具有
Attributes,如您所写,可以通过 来嘲笑
var Attributes = new object[]{
new {Name="key", Value="Main"},
new {Name="value", Value="web"}
};
那么问题是你有匿名类型,其名称无法轻易提取。
看一下这段代码(您可以将其粘贴到 LinqPad 编辑器窗口的 main() 方法中来执行):
var linq=from a in Attributes
let s = string.Join(",",a).TrimStart('{').TrimEnd('}').Split(',')
select new
{
Value = s[0].Split('=')[1].Trim(),
Name = s[1].Split('=')[1].Trim()
};
//linq.Dump();
由于您无法访问 object[] 数组内变量 Attributes 的 Name 和 Value 属性,因为编译器对您隐藏了它们,因此技巧是使用 Join(",", a)绕过这个限制的方法。
之后您需要做的就是trim和split生成的字符串,最后创建一个具有Value和Name属性的新对象。 如果您取消注释 LinqPad 中的 linq.Dump(); 行,您可以尝试一下 - 它会返回您想要的内容,并且还可以通过 Linq 语句进行查询。