Problemas de Linq To Xml usando el método Elementos de XElement (XName)

Tengo un problema con Linq To Xml.

Un código simple. Tengo este XML:

   aaa email@email.ext 2002-09-22 000:000000 Description for this contact   sss email@email.ext 2002-09-22 000:000000 Description for this contact   bbb email@email.ext 2002-09-22 000:000000 Description for this contact   ccc email@email.ext 2002-09-22 000:000000 Description for this contact  

Quiero que cada contacto lo asigne en un objeto Contacto. Para ello uso este fragmento de código:

 XDocument XDoc = XDocument.Load(System.Web.HttpRuntime.AppDomainAppPath + this.filesource); XElement XRoot = XDoc.Root; //XElement XEl = XElement.Load(this.filesource); var results = from e in XRoot.Elements("contact") select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null); List cntcts = new List(); foreach (Contact cntct in results) { cntcts.Add(cntct); } Contact[] c = cntcts.ToArray(); // Encapsulating element Elements final = new Elements(c); 

Ok, no importa que todo: enfócate en esto:

Cuando obtengo el nodo raíz, está bien, lo obtengo correctamente.

Cuando uso la directiva de selección, trato de que todos los nodos digan: desde e en

 XRoot.Elements("contact") 

OK, aquí está el problema: si uso: de e en XRoot.Elements () obtengo todos los nodos de contacto, pero si uso: de e en XRoot.Elements (“contact”) NO OBTENGO NADA: Vacío SET.

OK, dime: usa el otro: OK LO HAGO, usemos: from e in XRoot.Elements() , obtengo todos los nodos de todos modos, ESO ES LO MÁS PERO AQUÍ VIENE EL OTRO PROBLEMA: Al decir: select new Contact((string)e.Element("name"), (string)e.Element("email"), "1-1-1", null, null); Intento acceder a , … TENGO QUE UTILIZAR .Elemento (“nombre”) Y NO FUNCIONA TAMBIÉN !!!!!!!! ¿¡¿QUÉ DEMONTA ESTO ?????? ??????? PARECE QUE NO ENCUENTRO EL NOMBRE QUE PASO, pero ¿cómo es posible? Sé que la función Elements () toma, sobrecargada, un argumento que es un XName que se asigna a una cadena. Tenga en cuenta que el código que escribí proviene de un ejemplo, debería funcionar.

Bastante fácil: hay un espacio de nombres XML en juego, que estás ignorando:

  

¡Necesitas agregar eso a tus consultas de Linq-to-XML!

Algo como:

 XNamespace ns = "http://www.example.com"; 

y entonces

 XRoot.Elements(ns + "contact") 

y, por supuesto, también use el espacio de nombres XML al acceder a los elementos secundarios:

 var results = from e in XRoot.Elements("contact") select new Contact(e.Element(ns + "name").Value, e.Element(ns + "email").Value, "1-1-1", null, null); 

Eso debería ayudar. Consulte la documentación de MSDN en Trabajar con espacios de nombres XML para obtener más detalles.

Para mi lo resolví así porque no tenía un espacio de nombres en mi XML:

 xmldoc.Root.Elements("contact"); 

Olvidé usar el método “Root”.