C# XML上的Linq从select中的嵌套元素获取值
我有一段XML代码,在上面用linq执行select语句。但是我在获取嵌套值角色时遇到问题C# XML上的Linq从select中的嵌套元素获取值,c#,xml,linq,C#,Xml,Linq,我有一段XML代码,在上面用linq执行select语句。但是我在获取嵌套值角色时遇到问题 <persons> <person> <name> <fn>Donald Duck</fn> <n> <family>Duck</family> <given>Donald</given> </n>
<persons>
<person>
<name>
<fn>Donald Duck</fn>
<n>
<family>Duck</family>
<given>Donald</given>
</n>
</name>
<email />
<tel teltype="voice" />
<tel teltype="mobile" />
<adr>
</adr>
<institutionrole roletype="Employee" />
<extension>
<institutions>
<institution institution="Division1">
<role>sales</role>
</institution>
<institution institution="Division2">
<role>observer</role>
</institution>
</institutions>
</extension>
</person>
</persons>
下面的代码将返回
institution
元素中其属性institution
等于division1
var xmlDoc = XDocument.Load(args[0]);
var institution = xmlDoc.Descendants("institution");
var roles = institution.Where(x =>
x.Attribute("institution").Value.ToLower() == "division1").Elements();
foreach (var xElement in roles)
{
// Do your business here working with ======>> xElement.Value
}
希望这对您有所帮助。好的,我已经完全重写了您的查询,这样我们就得到了
机构
元素和n
元素,而不是试图直接在let
子句中找到角色。我认为这是一个简单得多的问题。我还要说,使用垂直空间比创建很长的线条更容易阅读——尽管这是主观的
using System;
using System.Linq;
using System.Xml.Linq;
class Test
{
static void Main()
{
var doc = XDocument.Load("test.xml");
var targetInstitution = "Division1";
var users =
from person in doc.Root.Elements("person")
let name = person.Element("name").Element("n")
let institution = person
.Element("extension")
.Elements("institutions")
.Elements("institution")
.SingleOrDefault(ins => (string) ins.Attribute("institution") == targetInstitution)
// Only include users where we've foudn the institution
where institution != null
select new
{
UserRole = (string) institution.Element("role"),
UserFirstName = (string) name.Element("given"),
UserLastName = (string) name.Element("family")
};
foreach (var user in users)
{
Console.WriteLine(user);
}
}
}
我使用了从XAttribute
和XElement
到string
的显式转换,而不是使用Value
属性。对于缺少的元素(我们最终得到的是空值而不是异常),这会“更好”(取决于您试图实现的目标),我发现它更容易阅读。同样,这有点主观
using System;
using System.Linq;
using System.Xml.Linq;
class Test
{
static void Main()
{
var doc = XDocument.Load("test.xml");
var targetInstitution = "Division1";
var users =
from person in doc.Root.Elements("person")
let name = person.Element("name").Element("n")
let institution = person
.Element("extension")
.Elements("institutions")
.Elements("institution")
.SingleOrDefault(ins => (string) ins.Attribute("institution") == targetInstitution)
// Only include users where we've foudn the institution
where institution != null
select new
{
UserRole = (string) institution.Element("role"),
UserFirstName = (string) name.Element("given"),
UserLastName = (string) name.Element("family")
};
foreach (var user in users)
{
Console.WriteLine(user);
}
}
}
与测试文件一起输出:
{ UserRole = sales, UserFirstName = Donald, UserLastName = Duck }
第一个
是否意味着是
?当你说它不起作用时,实际发生了什么?您是否得到异常或返回的值为空?我不希望ins.Elements(“institution”).Attribute(“institution”).value
起作用-这是试图从多个元素中获取单个属性值。你期望它做什么?(老实说,我不希望它能够编译。)我修复了XML的开头和缩进,但仍然很清楚您想要实现什么,特别是考虑到您正在将角色和Institution属性与单位
进行比较。你能给出一个清晰的例子,说明你对结果的期望吗?在这一点上,它应该更容易帮助您,并且可能使代码更易于阅读。我想列出特定机构中的人员及其角色。名单:唐老鸭,销售温妮·坡,customerCare@JohnyL:我确实声明:“我使用了从XAttribute和XElement到string的显式转换,而不是使用Value属性。”