nodo leer especifico atributos c# xml linq-to-xml

c# - leer - XDocument obtiene el elemento XML por el valor de su atributo de nombre



leer atributos xml c# (2)

Tengo un resultado XML como este

<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">16</int> </lst> <result name="response" numFound="3" start="0" maxScore="1.0"> <doc> <str name="ContaFirstname"> firstname1 </str> <str name="ContaId">6557</str> <str name="ContaJobTitle">Manager</str> <str name="ContaSurname">surname1 </str> </doc> <doc> <str name="ContaFirstname">firstname2</str> <str name="ContaId">6203</str> <str name="ContaJobTitle">Director</str> <str name="ContaSurname">surname2</str> </doc> </result> </response>

Quiero obtener una lista de objetos, y cada objeto contendrá el valor de ContaFirstname , ContaId , ContaJobTitle y ContaSurname

Intenté algo como esto, pero eso no es correcto porque los obtengo a todos NULL

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

Entonces, ¿cómo se puede acceder a estos elementos por nombre?


Esto resuelve tu problema:

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") };

o, si quieres los valores (en lugar de 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 };


No desea acceder a los elementos por su nombre, ya que la mayoría de las personas interpretarían esa declaración. Desea acceder a los elementos por el valor de su atributo de name :

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

Es posible que desee abstraerlo en un método separado, ya que será un dolor hacerlo varias veces. Por ejemplo:

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

Entonces:

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

Si tiene alguna oportunidad de darle a su documento una estructura más sensible, sería preferible ...