I have an XML
result like this
0
Does this solve your problem:
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")
};
or, if you want the values (instead of 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
};
You don't want to access the elements by name as most people would interpret that statement. You want to access the elements by the value of their name
attribute:
firstname = (string) c.Elements("str")
.First(x => x.Attribute("name").Value == "ContaFirstname");
//etc
You may well want to abstract that into a separate method, as it's going to be a pain to do it multiple times. For example:
public static XElement ElementByNameAttribute(this XContainer container,
string name)
{
return container.Elements("str")
.First(x => x.Attribute("name").Value == name);
}
Then:
var test = from c in xml.Descendants("doc")
select new
{
firstname = c.ElementByNameAttribute("ContaFirstname").Value,
surnmane = c.ElementByNameAttribute("ContaSurname").Value
};
If you have any chance to give your document a more sensible structure, that would be preferable...