2013-06-11 6 views
0

J'ai donc ce fichier XML que je produis, il ressemble à ceci:Trouver des éléments dans LINQ to XML

<?xml version="1.0" encoding="utf-8"?> 
<Members xmlns="urn:lst-emp:emp"> 
    <Member xmlns=""> 
    <!--Info for Member TESTER--> 
    <AccountName>Test Name</AccountName> 
    <AccountNumber>Test Number</AccountNumber> 
    <AccountBalance>Test Balance</AccountBalance> 
    </Member> 
    <Member xmlns=""> 
    <!--Info for Member Jeff Reed--> 
    <AccountName>Jeff Reed</AccountName> 
    <AccountNumber>5929</AccountNumber> 
    <AccountBalance>9223.01</AccountBalance> 
    </Member> 
</Members> 

Je peux chercher dans le fichier XML entier pour AccountName en utilisant la méthode ci-dessous, mais après qu'il arrive Comme un match, j'ai besoin d'un moyen d'obtenir ce xElements AccountNumber coorespondant pour valider son PIN (numéro de compte) est égal à celui de mon champ de texte de mot de passe.

internal static bool userExists(String validationName) 
    { 
     bool foundUser = false; 
     //check for a name 
     XElement xelement = XElement.Load(Application.LocalUserAppDataPath + "\\members.xml"); 
     IEnumerable<XElement> members = xelement.Elements(); 
     foreach (var member in members) 
     { 
      if (member.Element("AccountName").Value == validationName) 
      { 
       //MessageBox.Show("It's a match."); 
       foundUser = true; 
       return foundUser; 
      } 
      else 
      { 
       //MessageBox.Show("No match found."); 
      } 
     } 
     return foundUser; 
    } 

Comment procéder? J'ai envisagé de le retourner dans mon objet BankMember, mais j'ai besoin d'un moyen d'analyser les informations du nom d'utilisateur correspondant en premier.

 BankMember newMember = new BankMember(txtBxAccountName.Text.ToString(), int.Parse(txtBxAccountNumber.Text), float.Parse(txtBxStartingBalance.Text.TrimStart('$'))); 
+0

Vous savez déjà comment obtenir 'AccountName', vous pouvez obtenir' AccountNumber' exactement de la même façon: 'member.Element (" AccountNumber ") .Valeur'. – svick

+0

De même, n'utilisez jamais float ou double pour représenter des valeurs monétaires. – svick

+0

Mais comment puis-je trouver des éléments spécifiques AccountNumber? Je recherche dans chaque AccountName une correspondance, mais une fois que je trouve l'élément correspondant, je dois trouver son numéro de compte. – Trent

Répondre

0

code suivant vous donner le numéro de compte de l'élément correspondant,

members.Where(x=> x.Element("AccountName").Value==validationName).Select(x=> x.Element("AccountNumber").Value).FirstOrDefault(); 
+0

Je pense que 'Single()' aurait plus de sens que 'FirstOrDefault()' ici. – svick

+0

Merci, simple et fonctionne très bien pour ce que je fais. – Trent

+0

@svick: Oui. mais mieux d'utiliser 'SingleOrDefault()' –

0

Parent est la clé. Quelque chose comme ceci:

internal static XElement FindMember(String validationName) 
    { 
     XDocument doc = XDocument.Load(Application.LocalUserAppDataPath + "\\members.xml"); 

     XElement accountNameElement = doc.Root 
             .Elements("Member") 
             .Elements("AccountName") 
             .FirstOrDefault(e => e.Value == validationName); 

     if (accountNameElement != default(XElement)) 
      return accountNameElement.Parent; 
     return default(XElement); 
    } 

invoquaient comme ceci:

 XElement memberElement= FindMember("Test Name"); 
     if (memberElement== default(XElement)) 
      Console.WriteLine("Not Found"); 
     else 
     { 
      Console.WriteLine("Found {0}, {1}, {2}" 
       , memberElement.Element("AccountName").Value 
       , memberElement.Element("AccountNumber").Value 
       , memberElement.Element("AccountBalance").Value); 
     }