2014-07-16 5 views
0

D'abord un peu d'arrière-plan. J'espère construire un programme pour dé-habiliter la reconnaissance des composants électroniques pour un fabricant électronique, c'est la section résistance du programme. J'ai choisi d'écrire en XML mais j'ai des problèmes d'interrogation comme je l'avais espéré.Fichier XML de requête utilisant plusieurs paramètres

Ceci est un exemple de mon fichier XML

<?xml version="1.0" encoding="UTF-8"?> 
    -<Resistors> 
     -<Resistor> 
      <ResistNo>RES144</ResistNo> 
      <Value>2K 0.6w</Value> 
      <Band1>Red</Band1> 
      <Band2>Black</Band2> 
      <Band3>Black</Band3> 
      <Band4>Brown</Band4> 
      <Band5>Brown</Band5> 
     </Resistor> 
    </Resistors> 

Pour être utilisable au niveau d'entrée, je dois être en mesure d'interroger et de filtrer les résistances par la couleur de bande, chaque résistance a un code de couleur unique afin de risque d'obtenir deux résultats est mince, voire inexistant.

Jusqu'ici j'ai ce code.

 var xmlResist = XDocument.Parse("resistor.xml"); 

     var elements = xmlResist.Element("Resistors") 
       .Descendants("Resistor") 
       .Where(x => x.Element("Band1").Value == txtBand1.Text) 
       .Where(x => x.Element("Band2").Value == txtBand2.Text) 
       .Where(x => x.Element("Band3").Value == txtBand3.Text) 
       .Where(x => x.Element("Band4").Value == txtBand4.Text) 
       .Where(x => x.Element("Band5").Value == txtBand5.Text); 

De là, je suis perdu, je dois saisir les valeurs de « ResistNo » et « valeur » et les poster dans txtResistNo.Text et txtValue.Text. Je me suis cogné la tête au chalut sur Internet pour quelque chose de très proche et le code ci-dessus est aussi proche que je l'ai trouvé.

Répondre

0

Tout ce que vous avez besoin est un Select:

var elements = xmlResist.Element("Resistors") 
      .Descendants("Resistor") 
      .Where(x => x.Element("Band1").Value == txtBand1.Text) 
      .Where(x => x.Element("Band2").Value == txtBand2.Text) 
      .Where(x => x.Element("Band3").Value == txtBand3.Text) 
      .Where(x => x.Element("Band4").Value == txtBand4.Text) 
      .Where(x => x.Element("Band5").Value == txtBand5.Text) 
      .Select(x => new 
         { 
          ResistNo = (string)x.Element("ResistNo"), 
          Value = (string)x.Element("Value") 
         }); 

vous pouvez également faire si plus efficace en utilisant un Where au lieu de cinq:

var elements = xmlResist.Element("Resistors") 
      .Descendants("Resistor") 
      .Where(x => x.Element("Band1").Value == txtBand1.Text && 
         x.Element("Band2").Value == txtBand2.Text && 
         x.Element("Band3").Value == txtBand3.Text && 
         x.Element("Band4").Value == txtBand4.Text && 
         x.Element("Band5").Value == txtBand5.Text) 
      .Select(x => new 
         { 
          ResistNo = (string)x.Element("ResistNo"), 
          Value = (string)x.Element("Value") 
         }); 

Si vous voulez un seul résultat utiliser First ou FirstOrDefault

+0

Merci J'aime l'efficacité. Je suis cependant un peu mouillé derrière les oreilles. Aurais-je raison de taper txtResistNo.Text = elements.ResistNo –

+0

@K_Spec select renvoie plusieurs résultats.Si vous utilisez First() après select, vous pouvez obtenir un résultat et vous pouvez utiliser 'txtResistNo.Text = elements.ResistNo' –

+0

Excellent merci. Je viens juste d'aplanir la nouvelle exception maintenant ** System.Xml.XmlException was unhandled Message = Les données au niveau de la racine sont invalides. Ligne 1, position 1 ** J'étais assez certain que le fichier XML était bien formé. Tant pis. Merci une fois de plus. –

Questions connexes