gpt4 book ai didi

c# - 使用 LINQ 解析 XML 获取子元素

转载 作者:数据小太阳 更新时间:2023-10-29 01:48:54 26 4
gpt4 key购买 nike

<?xml version="1.0" standalone="yes"?>
<CompanyInfo>
<Employee name="Jon" deptId="123">
<Region name="West">
<Area code="96" />
</Region>
<Region name="East">
<Area code="88" />
</Region>
</Employee>
</CompanyInfo>

public class Employee
{
public string EmployeeName { get; set; }
public string DeptId { get; set; }
public List<string> RegionList {get; set;}
}

public class Region
{
public string RegionName { get; set; }
public string AreaCode { get; set; }
}

我正在尝试读取此 XML 数据,到目前为止我已尝试过:

XDocument xml = XDocument.Load(@"C:\data.xml");
var xElement = xml.Element("CompanyInfo");
if (xElement != null)
foreach (var child in xElement.Elements())
{
Console.WriteLine(child.Name);
foreach (var item in child.Attributes())
{
Console.WriteLine(item.Name + ": " + item.Value);
}

foreach (var childElement in child.Elements())
{
Console.WriteLine("--->" + childElement.Name);
foreach (var ds in childElement.Attributes())
{
Console.WriteLine(ds.Name + ": " + ds.Value);
}
foreach (var element in childElement.Elements())
{
Console.WriteLine("------->" + element.Name);
foreach (var ds in element.Attributes())
{
Console.WriteLine(ds.Name + ": " + ds.Value);
}
}
}
}

这使我能够获取每个节点及其属性名称和值,因此我可以将这些数据保存到数据库中的相关字段中,但这似乎是一个冗长的方法不灵活,例如如果 XML 结构发生变化,所有这些 foreach 语句都需要重新访问,并且这种方式很难过滤数据,我需要编写某些 if 语句来过滤数据(例如,仅从西部获取员工等...)

我一直在寻找一种更灵活的方式,使用 linq,像这样:

List<Employees> employees =
(from employee in xml.Descendants("CompanyInfo")
select new employee
{
EmployeeName = employee.Element("employee").Value,
EmployeeDeptId = ?? get data,
RegionName = ?? get data,
AreaCode = ?? get data,,
}).ToList<Employee>();

但我不确定如何从子节点获取值并应用过滤(仅获取某些员工)。这可能吗?感谢您的帮助。

谢谢

最佳答案

var employees = (from e in xml.Root.Elements("Employee")
let r = e.Element("Region")
where (string)r.Attribute("name") == "West"
select new Employee
{
EmployeeName = (string)e.Attribute("employee"),
EmployeeDeptId = (string)e.Attribute("deptId"),
RegionName = (string)r.Attribute("name"),
AreaCode = (string)r.Element("Area").Attribute("code"),
}).ToList();

但当 XML 文件结构发生变化时,仍然需要修改查询。

编辑

查询每个员工的多个区域:

var employees = (from e in xml.Root.Elements("Employee")
select new Employee
{
EmployeeName = (string)e.Attribute("employee"),
DeptId = (string)e.Attribute("deptId"),
RegionList = e.Elements("Region")
.Select(r => new Region {
RegionName = (string)r.Attribute("name"),
AreaCode = (string)r.Element("Area").Attribute("code")
}).ToList()
}).ToList();

然后您可以过滤来自给定区域的员工列表:

var westEmployees = employees.Where(x => x.RegionList.Any(r => r.RegionName == "West")).ToList();

关于c# - 使用 LINQ 解析 XML 获取子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18891206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com