C#, Linq to XML ajouter, mettre à jour, supprimer
J'ai ce code
XElement newClient= new XElement("Client",
new XElement("Name", cmbClient.Text),
new XElement("Service",
new XElement("ServName", cmbService.Text)));
xmlDoc.Add(newClient);
xmlDoc.Save("Settings.xml");
Qui crée cette
<?xml version="1.0" encoding="utf-8"?>
<Clients>
<Client>
<Name>Client Name</Name>
<Services>
<ServName>Service Name</ServName>
</Services>
</Client>
</Clients>
Si j'appuyez de nouveau sur Button1, puis Il va créer un autre Client de la section, c'est OK, mais ce que je veux, c'est:
- Créer un nouveau Client de la section si elle ne pas existe.
- Si le Client existe, alors ajouter un Nomserveur, au lieu de les remplacer
ce qui est déjà le cas. - Si un service existe déjà sur un client, puis ne rien faire, car il existe déjà.
La moindre idée? Je commence avec linq to xml... merci des conseils!
EDIT: la Solution fournie par mixin réponses de Dmitry Dovgopoly et Leon Newswanger merci à vous deux! 😀
XDocument xDoc = XDocument.Load("Settings.xml");
var Clients =
from client in xDoc.Root.Elements("Client")
where client.Element("Name").Value == cmbClient.Text
select client;
if (Clients.Count() > 0)
{
var Client =
(from client in xDoc.Root.Elements("Client")
where client.Element("Name").Value == cmbClient.Text
select client).Single();
if (Client.Element("Services").Elements().Count(el => el.Value == cmbService.Text) == 0)
{
Client.Element("Services").Add(new XElement("ServName", cmbService.Text));
}
}
else
{
XElement newClient = new XElement("Client",
new XElement("Name", cmbClient.Text),
new XElement("Services",
new XElement("ServName", cmbService.Text)));
xDoc.Root.Add(newClient);
}
xDoc.Save("Settings.xml");
qu'est-ce que xmlDoc?
XElement xmlDoc = XElement.Load("settings.xml");
XElement xmlDoc = XElement.Load("settings.xml");
OriginalL'auteur Robert W. Hunter | 2012-11-08
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
XElement.Element(name)
méthode pour obtenir de l'élément spécifique ouXElement.Elements()
pour énumérer tous les éléments.OriginalL'auteur Dmitry Dovgopoly
Pas testé, mais devrait fonctionner.
u r le mélange linq2xml avec XmlDocument
AYK est en supposant xmlDoc que le type XmlDocument, au lieu de XElement. L'utilisation juste et XElement comme dans votre exemple original.
Merci @Rik. Vous aviez raison.
OriginalL'auteur AYK
Vous pourriez essayer:
OriginalL'auteur chridam
C'est testé et de travail:
Note:
Si cmbService est null, il va encore créer le service, mais comme une balise vide. Si vous allez l'utiliser pour lire et écrire avec les possibilités de valeurs null, vous aurez à vérifier pour eux à un certain point.
Je m'en rends compte, mais à partir du contexte de la question, il serait plus logique de l'ouvrir comme un XDocument puisque le contenu de venir directement à partir d'un fichier.
Il n'est pas de travail, il crée un nouveau client et un nouveau service s'il n'existe pas, mais si j'essaie d'ajouter un autre service de mon client, rien hapens...
Je suis désolé, j'ai du mal comprendre la question. J'étais sous l'hypothèse qu'il n'y avait qu'un seul service par le client. Permettez-moi de m'assurer que je comprends votre objectif avant de me faire des modifications. Si un client existe et que le service ne fonctionne pas, vous voulez ajouter le service. Si le client existe et le service pour le client, ne rien faire parce qu'il existe. Si le client n'existe pas, ajoutez une nouvelle entrée de client. Est-ce correct?
OriginalL'auteur Leon Newswanger