2010-12-01 5 views
4

Je voudrais filtrer avec des éléments XML haute performance à partir d'un document XML.Filtre XDocument plus efficacement

Prenez par exemple ce fichier XML avec des contacts:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="asistentes.xslt"?> 
<contactlist evento="Cena Navidad 2010" empresa="company"> 
    <contact type="1" id="1"> 
    <name>Name1</name> 
    <email>[email protected]</email> 
    <confirmado>SI</confirmado> 
    </contact> 
    <contact type="1" id="2"> 
    <name>Name2</name> 
    <email>[email protected]</email> 
    <confirmado>Sin confirmar</confirmado> 
    </contact> 
</contaclist> 

Mon code actuel pour filtrer de ce document XML:

using System; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     string xml = @" the xml above"; 
     XDocument doc = XDocument.Parse(xml); 

     foreach (XElement element in doc.Descendants("contact")) { 
     Console.WriteLine(element); 
     var id = element.Attribute("id").Value; 
     var valor = element.Descendants("confirmado").ToList()[0].Value; 
     var email = element.Descendants("email").ToList()[0].Value; 
     var name = element.Descendants("name").ToList()[0].Value; 
     if (valor.ToString() == "SI") { } 
     } 
    } 
} 

Quelle serait la meilleure façon d'optimiser ce code pour filtrer <confirmado> le contenu de l'élément?

Répondre

9
var doc = XDocument.Parse(xml); 

var query = from contact in doc.Root.Elements("contact") 
      let confirmado = (string)contact.Element("confirmado") 
      where confirmado == "SI" 
      select new 
      { 
       Id = (int)contact.Attribute("id"), 
       Name = (string)contact.Element("name"), 
       Email = (string)contact.Element("email"), 
       Valor = confirmado 
      }; 

foreach (var contact in query) 
{ 
    ... 
} 

Points d'intérêt:

  • doc.Root.Elements("contact") sélectionne uniquement les <contact> éléments dans la racine du document, au lieu de rechercher le document entier pour <contact> éléments . Le XElement.Element method renvoie le premier élément enfant avec le nom donné. Pas besoin de convertir les éléments enfants en liste et prendre le premier élément. Les classes XElement et XAttribute fournissent une large sélection de convenient conversion operators.

+0

la requête ne reçoit pas: '(le problème est le fichier xml pas entièrement, est peut-être avec XSLT Kiquenet

+0

@alhambraeidos:?. Fixe. – dtb

0

Vous pouvez utiliser LINQ:

foreach (XElement element in doc.Descendants("contact").Where(c => c.Element("confirmado").Value == "SI")) 
Questions connexes