Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML上的Linq从select中的嵌套元素获取值_C#_Xml_Linq - Fatal编程技术网

C# 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>

我有一段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>

下面的代码将返回
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属性。”