XDocument通过其name属性的值获取XML元素
我有这样的XML
结果
0 16 firstname1 6557 Manager surname1 firstname2 6203 Director surname2
我想获得一个对象列表,每个对象都包含ContaFirstname
, ContaId
, ContaJobTitle
和ContaSurname
我试过这样的东西,但那不对,因为我把它们全部都搞定了
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 };