簡體   English   中英

Linq on XML從select中的嵌套元素獲取價值

[英]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子句中查找角色。 我認為這最終是一個更簡單的查詢。 我還要說的是,使用垂直空間比創建很長的線條更容易閱讀-盡管這是主觀的。

我使用了從XAttributeXElementstring的顯式轉換,而不是使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM