2011-04-25 17 views
8

tengo un XMLUsando Linq y XDocument, ¿puedo obtener todos los elementos secundarios bajo la etiqueta padre?

<data> 
    <summary> 
    <account curr_desc='USD' acct_nbr='123' net='1000.00' /> 
    <account curr_desc='USD' acct_nbr='456' net='2000.00' /> 
    </summary> 
    <details> 
    <accounts> 
     <account acct_nbr="123" curr="USD"> 
     <activity color='False' settle_date='02 Jul 2010' amt='580.00' /> 
     <activity color='True' settle_date='09 Jul 2010' amt='420.00' /> 
     </account> 
     <account acct_nbr="456" curr="USD"> 
     <activity color='True' settle_date='12 Dec 2010' amt='1500.00' /> 
     <activity color='True' settle_date='19 Dec 2010' amt='500.00' /> 
     </account> 
    </accounts> 
    </details> 
</data> 

El uso de LINQ y XDocument, que puede extraer información "Resumen", pero ¿cómo puedo extraer "cuenta" información bajo la etiqueta "Resumen"?

XDocument XMLDoc = XDocument.Load("testdata.xml"); 
XElement accounts = (from xml2 in XMLDoc.Descendants("summary") 
        select xml2).FirstOrDefault(); 

¿Cómo puedo especificar algo como "summary/account", por lo que me devuelve todos los elementos bajo <summary>? Tenga en cuenta que tengo <account> bajo <detail><accounts>, solo quiero los elementos debajo de la etiqueta de resumen.

Editar: (Solución de Andrew)

var accounts = XMLDoc.Root.Elements("summary").Elements("account"); 
foreach (XElement elem in accounts) 
{ 
    sb.Append(elem.ToString()); 
} 
+0

debería echar un vistazo a LinqPad, le permite probar este tipo de cosas sobre la marcha. es limpio. :) –

+0

Escribir 'de x en ... seleccionar x' es inútil. Simplemente escriba el código después de 'in' directamente. – svick

+0

2svick, tienes razón en realidad ... No me di cuenta. He actualizado el código ahora :) ¡Gracias! –

Respuesta

18

Se debe utilizar la Elements método:

var accounts = doc.Root.Elements("summary").Elements("account"); 

O, alternativamente, XPathSelectElements, que en este caso es más simple:

var accounts = doc.XPathSelectElements("/data/summary/account"); 

En este caso también se puede utilizar Descendants, como Andrew Barbero sugerido, pero en general solo debes hacer esto cuando realmente quieras encontrar todos los descendientes con un nombre dado, y no solo hijos inmediatos. De lo contrario, su código realiza muchas búsquedas que no es necesario y puede devolver elementos que no desea.

+0

Oh ... ¡Ni siquiera me había dado cuenta de que estaba usando 'Descendants' en lugar de' Elements' !!! –

+0

Se corrigió mi respuesta, y +1 por anotar eso; 'Descendants' funcionaría en este caso, pero podría tener malos resultados si hubiera otros elementos con los mismos nombres en otros lugares. –

3
var accountSummaryElems = 
    XMLDoc.Element("summary").Elements("account"); 

Esto le da una colección de los account elementos bajo el elemento summary. Luego puede iterarlos para obtener los valores.

EDITADO para usar el mismo patrón que usted; Llamo al First() en lugar de FirstOrDefault() porque ese código no se ejecutará de todos modos si no se encuentra el elemento "cuenta".

Luego tiene la idea correcta al iterar sobre la colección devuelta.

+0

gracias Andrew. Supongo que puedo usar tu solución para obtener el resultado. Estoy editando mi publicación original. Apreciar si puedes validar. –

+0

He cometido un error en mi publicación original; Estoy editando para corregir. –

+0

He publicado la solución ... puede verificarla. aprecio tu ayuda. –

Cuestiones relacionadas