2010-11-09 24 views
9

He elegido el título aquí porque mi problema es que necesito obtener los nodos de elementos mencionados en el ejemplo. Tengo el siguiente XML y tengo problemas al usar LINQ para consultarlo, he podido analizar XML antes; sin embargo, he estado atascado en esto durante horas y espero que alguien pueda ayudar. Aquí es mis datos XML siguientes (datos de ejemplo):Cómo obtener elementos por nombre en XML usando LINQ

<a:entry xmlns:a="http://www.w3.org/2005/Atom"> 
<a:id>98765</a:id> 
<info>Data Catalogue</info> 
    <data> 
    <items> 
      <item> 
       <id>123456</id> 
       <value>Item One</value> 
      </item> 
      <item> 
       <id>654321</id> 
       <value>Item Two</value> 
      </item> 
     <items> 
    </data> 
    <items> 
     <item> 
     <id>123456</id> 
     <value>Item One</value> 
     </item> 
     <item> 
     <id>654321</id> 
     <value>Item Two</value> 
     </item> 
    <items> 
    <a:author> 
    <a:name>Catalogue</a:name> 
    </a:author> 
</a:entry> 

Quiero ser capaz de extraer el ID de la etiqueta XML de artículos en Elementos, sin embargo no es una etiqueta artículos con Registros de artículos en virtud de los datos no lo hago quiero estos nodos para nada; quiero root/items/id/id si esto se expresó como ruta. He intentado con LINQ todo lo que sé, así que si alguien puede ayudar, hay que tener en cuenta que, aunque se trata de datos de muestra, se basa en el sistema; el formato no puede modificarse, por lo que no es una solución aceptable.
Parece que no puedo determinar dónde me está yendo mal: cada expresión de LINQ que intento no arroja nada, creo que el espacio de nombres es un problema y he tratado de integrar esto, pero voy en círculos.
solución debe trabajar en Silverlight y C#

he intentado lo siguiente:

IEnumerable<XElement> nodes = 
element.Elements().Where(e => e.Name.LocalName == "items") 

Sin embargo esto me lleva todos los "elementos" que incluyen las que están en "datos" que no quieren esos.


Si hago lo siguiente en mi XML Yo veo los nombres de los elementos exhibidas:

XElement element = XElement.Parse(data); 
foreach (XElement node in element.Elements()) 
{ 
    MessageBox.Show(node.Name.LocalName); 
} 

Sin embargo cuando hago esto, no puede ver los nombres de los nodos en los literales a todos - I' he comprobado el XElement y tiene el nodo y cuando arrojo los nombres arriba, aparece "artículos" junto con la información y la identificación.

foreach (XElement node in element.Elements("items")) 
    { 
    MessageBox.Show(node.Name.LocalName); 
    } 
+1

lo he descubierto - hubo una declaración de espacio extra que estaba en blanco - la adición de un espacio de nombres implícita a mi XML, utilizando el XNamespace para esto y agregarlo al nombre del elemento resuelve el problema! – RoguePlanetoid

Respuesta

18

Suponiendo element es su elemento <a:entry>:

var ids = element.Element("items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 

El Element y Elements métodos de devolución sólo los niños directos, no todos los descendientes, por lo que no devuelve el elemento que se encuentra bajo <items><data>

+1

Esto no funciona, aunque pensé que así sería, ya que este es el tipo de cosas que he usado antes - me parece que no puedo obtener ningún elemento de la raíz en absoluto. Había un nodo de valor fuera de la raíz que dejé en el ejemplo y tampoco puedo leerlo, si consulto a los descendientes hay algunos allí, simplemente no sé lo que está pasando. – RoguePlanetoid

+0

¡Esto funciona una vez que tomo en cuenta el espacio de nombres como mi propia respuesta! – RoguePlanetoid

+0

No proporcionó esa información en su pregunta ... Lo intenté utilizando el elemento '' como raíz y funcionó bien. –

6

Tenía una declaración de NameSpace en blanco en mi XML No me había dado cuenta una vez que agregué esto en mi código funcionó - se olvidó LINQ es muy NameSpace ori ented!

XNameSpace ns = "http://example.org/namespace"; 
var ids = element.Element(ns + "items") 
       .Elements("item") 
       .Select(item => item.Element("id").Value); 
+1

¡Tuve el mismo problema, esto lo resolvió! –

Cuestiones relacionadas