[英]Linq on XML get value from nested elements in select
我有這個XML代碼,可以在linq上執行select語句。 但是我在獲得嵌套的價值角色時遇到了問題。
<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>
我選擇所有人員,然后過濾,例如,institutional = Division1,然后我想要該機構上的角色值。
到目前為止我的代碼,但是let角色=不起作用
var users = (from person in xmlDoc.Descendants("person")
let role = person.Element("extension").Descendants("institutions").SingleOrDefault(ins => ins.Elements("institution").Attribute("institution").Value.ToLower() == units).Select(ins => ins.Element("role")).FirstOrDefault().ToString()
where person.Element("extension").Descendants("institutions").Elements("institution").Attributes("institution").Where(ins => ins.Value.ToLower() == units).Any();
select new User(){
userRole = role,
UserLastname = person.Element("name").Element("n").Element("family").Value,
UserFirstname = person.Element("name").Element("n").Element("given").Value
}).ToArray();
后面的代碼將返回其institution
等於division1
institution
元素中的所有角色
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
}
希望這對您有所幫助。
好的,我已經完全重寫了您的查詢,以使我們得到的是institution
元素和n
元素,而不是嘗試直接在let
子句中查找角色。 我認為這最終是一個更簡單的查詢。 我還要說的是,使用垂直空間比創建很長的線條更容易閱讀-盡管這是主觀的。
我使用了從XAttribute
和XElement
到string
的顯式轉換,而不是使用Value
屬性。 這在缺少元素的情況下(根據您要實現的目標)“更好”(取決於結果,我們最終得到的是null值而不是異常),並且我發現它更易於閱讀。 同樣,這有點主觀。
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 }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.