2014-05-13 1 views
0

Mon problème est que j'ai un élément e-mail d'occurence max 3 dans mon fichier xml comme indiqué ci-dessous:Mise à jour xml innerText avec les noms de balises similaires (élément)

<contact> 
<email>A</email> 
<email>B</email> 
<email>C</email> 
</contact> 

Lorsque j'ai essayé de modifier les 3 tags avec le code suivant ci-dessous,

xnl[0]["email"].InnerText = "D"; 
xnl[0]["email"].InnerText = "E"; 
xnl[0]["email"].InnerText = "F"; 

Seul le premier e-mail est édité, il y a le problème de même à cause de l'écrasement nom de l'élément XML.

<contact> 
<email>F</email> 
<email>B</email> 
<email>C</email> 
</contact> 

J'ai essayé xnl[0]["email"][0].InnerText = "D"; d'avoir choisi le premier nom de l'élément de courrier électronique, mais cela ne fonctionne pas. Toute suggestion?

MISE À JOUR: (avec le code)

C# code:

 public String updateContact(Int32 getPhoneNumber, Int32 getWorkNumber, Int32 getMobileNumber, String photo, String firstName, String lastName, String gender, String dateOfBirth, Int32 home, Int32 work, Int32 mobile, String email1, String email2, String email3) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load("xmlFile/xml/myContactBook/src/myContactBook.xml"); 

     XmlNodeList xnl = doc.SelectNodes("/contactBook/contact/phone[home='" + getPhoneNumber + "']/parent::* | /contactBook/contact/phone[work='" + getWorkNumber + "']/parent::* | /contactBook/contact/phone[mobile='" + getMobileNumber + "']/parent::* "); 

     if (xnl.Count != 0) 
     { 
      xnl[0]["photo"].InnerText = photo; 
      xnl[0]["firstName"].InnerText = firstName; 
      xnl[0]["lastName"].InnerText = lastName; 
      xnl[0]["gender"].InnerText = gender; 
      xnl[0]["dateOfBirth"].InnerText = dateOfBirth; 
      xnl[0]["phone"]["home"].InnerText = home.ToString(); 
      xnl[0]["phone"]["work"].InnerText = work.ToString(); 
      xnl[0]["phone"]["mobile"].InnerText = mobile.ToString(); 
      xnl[0]["email"].InnerText = email1; 
      xnl[0]["email"].InnerText = email2; 
      xnl[0]["email"].InnerText = email3; 

     } 

     doc.Save("xmlFile/xml/myContactBook/src/myContactBook.xml"); 

     return "Updated"; 
    } 

code xml:

<contact> 
<photo>profilepic/default.jpg</photo> 
<firstName>Hender</firstName> 
<lastName>Casio</lastName> 
<gender>Female</gender> 
<dateOfBirth>1985-04-23</dateOfBirth> 
<phone> 
    <home>4453278</home> 
    <work>3451390</work> 
    <mobile>54356635</mobile> 
</phone> 
<email>[email protected]</email> 
<email>[email protected]</email> 
<email>[email protected]</email> 
</contact> 

Répondre

1

Problème Même lorsque vous recevez plusieurs contacts retournés dans XmlNodeList à partir de votre requête XPath, vous êtes juste mettre à jour le premier noeud.

Si vous êtes sûr que votre requête XPath doit renvoyer un ou aucun contact, vous devez utiliser SelectSingleNode.

Voici fiddle.

XmlDocument doc = new XmlDocument(); 
doc.Load("xmlFile/xml/myContactBook/src/myContactBook.xml"); 

XmlNode xn = doc.SelectSingleNode("/contactBook/contact/phone[home='" + getPhoneNumber + "']/parent::* | /contactBook/contact/phone[work='" + getWorkNumber + "']/parent::* | /contactBook/contact/phone[mobile='" + getMobileNumber + "']/parent::* "); 

if (xn != null) 
{ 
    xn["photo"].InnerText = photo; 
    xn["firstName"].InnerText = firstName; 
    xn["lastName"].InnerText = lastName; 
    xn["gender"].InnerText = gender; 
    xn["dateOfBirth"].InnerText = dateOfBirth; 
    xn["phone"]["home"].InnerText = home.ToString(); 
    xn["phone"]["work"].InnerText = work.ToString(); 
    xn["phone"]["mobile"].InnerText = mobile.ToString(); 

    XmlNodeList xnl = xn.SelectNodes("email"); 
    xnl[0].InnerText = email1; 
    xnl[1].InnerText = email2; 
    xnl[2].InnerText = email3; 
} 

doc.Save("xmlFile/xml/myContactBook/src/myContactBook.xml"); 
return "Updated"; 

MISE À JOUR: (Solution 2) Dans le cas où plusieurs résultats sont renvoyés de votre requête XPath:

XmlDocument doc = new XmlDocument(); 
doc.Load("xmlFile/xml/myContactBook/src/myContactBook.xml"); 

XmlNodeList xnl = doc.SelectNodes("/contactBook/contact/phone[home='" + getPhoneNumber + "']/parent::* | /contactBook/contact/phone[work='" + getWorkNumber + "']/parent::* | /contactBook/contact/phone[mobile='" + getMobileNumber + "']/parent::* "); 

foreach(XmlNode xn in xnl) 
{ 
    xn["photo"].InnerText = photo; 
    xn["firstName"].InnerText = firstName; 
    xn["lastName"].InnerText = lastName; 
    xn["gender"].InnerText = gender; 
    xn["dateOfBirth"].InnerText = dateOfBirth; 
    xn["phone"]["home"].InnerText = home.ToString(); 
    xn["phone"]["work"].InnerText = work.ToString(); 
    xn["phone"]["mobile"].InnerText = mobile.ToString(); 

    XmlNodeList xnlElement = xn.SelectNodes("email"); 
    xnlElement[0].InnerText = email1; 
    xnlElement[1].InnerText = email2; 
    xnlElement[2].InnerText = email3; 
} 

doc.Save("xmlFile/xml/myContactBook/src/myContactBook.xml"); 
return "Updated"; 
+0

Merci pour la réponse. Désolé Hassan Nisar, je n'étais peut-être pas assez clair sur mon code. J'ai maintenant édité le message original. Comment puis-je effectuer une nouvelle recherche dans un XmlNodeList? C'est possible? – Jonathan

+0

XmlNodeList représente une collection ordonnée de noeuds. Vous pouvez traverser XmlNodeList en utilisant la boucle. Si vous êtes sûr qu'un résultat sera retourné, vous pouvez utiliser 'SelectSingleNode'. – Hassan

+0

Je viens de mettre à jour ma réponse s'il vous plaît vérifier. – Hassan

Questions connexes