XDocument通过其name属性的值获取XML元素

我有这样的XML结果

   0 16     firstname1  6557 Manager surname1    firstname2 6203 Director surname2    

我想获得一个对象列表,每个对象都包含ContaFirstnameContaIdContaJobTitleContaSurname

我试过这样的东西,但那不对,因为我把它们全部都搞定了

 var test = from c in xml.Descendants("doc") select new { firstname = c.Element("ContaFirstname"), surnmane = c.Element("ContaSurname") }; 

那么如何通过名称访问这些元素?

您不希望按名称访问元素,因为大多数人会解释该语句。 您希望通过其name属性的值访问元素:

 firstname = (string) c.Elements("str") .First(x => x.Attribute("name").Value == "ContaFirstname"); //etc 

您可能希望将其抽象为一个单独的方法,因为多次执行它会很麻烦。 例如:

 public static XElement ElementByNameAttribute(this XContainer container, string name) { return container.Elements("str") .First(x => x.Attribute("name").Value == name); } 

然后:

 var test = from c in xml.Descendants("doc") select new { firstname = c.ElementByNameAttribute("ContaFirstname").Value, surnmane = c.ElementByNameAttribute("ContaSurname").Value }; 

如果您有机会为您的文档提供更合理的结构,那将更可取……

这是否解决了您的问题:

 var test = from c in xml.Descendants("doc") select new { firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname"), surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname") }; 

或者,如果你想要值(而不是XElement

 var test = from c in xml.Descendants("doc") select new { firstname = c.Elements("str").First(element => element.Attribute("name").Value == "ContaFirstname").Value, surnmane = c.Elements("str").First(element => element.Attribute("name").Value == "ContaSurname").Value };