2010-10-06 15 views
1

Je construis une application Parts afin d'apprendre C# et WPF. J'essaie d'avoir du mal à ajouter de nouvelles pièces en utilisant XmlWriter. Je peux créer le fichier XML, mais ne peux pas comprendre comment ajouter des parties supplémentaires. Devrais-je utiliser autre chose comme XmlDocument? Voici mon code derrière:C# Ajouter des données au fichier xml

private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 

     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Encoding = Encoding.UTF8; 
     settings.Indent = true; 

     using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings)) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("MyParts"); 
      writer.WriteStartElement("parts"); 
      writer.WriteStartElement("item"); 
      writer.WriteString(txtbxitem.Text); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("color"); 
      writer.WriteString(txtbxcolor.Text); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("size"); 
      writer.WriteString(txtbxsize.Text); 
      writer.WriteEndElement(); 

      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 

      writer.Flush(); 
      writer.Close(); 

     } 
    } 

Ce code crée le fichier xml et un noeud correctement, mais comment puis-je ajouter des pièces supplémentaires? Voici ce que j'essaie de créer:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

<MyParts> 
    <parts> 
    <item>Part1</item> 
    <color>Red</color> 
    <size>SM</size> 
    </parts> 
    <parts> 
    <item>Part2</item> 
    <color>Blue</color> 
    <size>XXL</size> 
    </parts> 
</MyParts> 

Répondre

5

Personnellement, je suggère d'utiliser LINQ to XML. C'est beaucoup API plus facile à utiliser que XmlDocument.

Mais oui, si vous voulez modifier un document existant, alors généralement en utilisant une représentation en mémoire est plus simple que d'utiliser une API de streaming. C'est possible pour faire ce dernier bien sûr, mais ce n'est pas facile.

Voici un exemple pour créer le même XML que vous avez déjà (autre que la déclaration: une raison pour laquelle vous voulez utiliser Latin-1 au lieu de quelque chose comme UTF-8 qui peut représenter l'ensemble de Unicode, btw)

var doc = new XDocument(
    new XElement("MyParts", 
    new XElement("parts", 
     new XElement("item", "Part1"), 
     new XElement("color", "Red"), 
     new XElement("size", "SM")), 
    new XElement("parts", 
     new XElement("item", "Part2"), 
     new XElement("color", "Blue"), 
     new XElement("size", "XXL")))); 

Alors si vous voulez ajouter une autre partie:

doc.Root.Add(
    new XElement("parts", 
    new XElement("item", "Part3"), 
    new XElement("color", "Green"), 
    new XElement("size", "L"))); 

Il est vrai que je vous attends voudriez encapsuler le bit « créer un élément de pièces » dans une méthode pour éviter de le répéter tout le temps ... mais hopef En gros, vous obtenez l'image.

+0

Je veux passer mon temps d'apprentissage à bon escient. –

+0

@Lone: En supposant que vous pouvez utiliser .NET 3.5 ou supérieur, c'est la meilleure solution pour * la plupart * des problèmes. Si vous avez affaire à un fichier volumineux, 'XmlReader' peut être utile, mais au moins * commencer * avec LINQ to XML. –

+0

Je suis d'accord avec @Jon: c'est plus facile! Ici, j'ai affaire à un simple document XML et XDocument est assez bon et facile à construire mon contenu (ce que vous voyez est ce que vous obtenez) –

0

Utilisez une boucle, et vous finirez avec quelque chose comme:

var parts = new List<Part>() { ...... parts here ...... };   

    using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings)) 
    { 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("MyParts"); 

     foreach(var part in parts) 
     { 
      writer.WriteStartElement("parts"); 
      writer.WriteStartElement("item"); 
      writer.WriteString(part.Item); 
      writer.WriteEndElement(); // </item> 

      writer.WriteStartElement("color"); 
      writer.WriteString(part.Color); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("size"); 
      writer.WriteString(part.Size); 
      writer.WriteEndElement(); // </size> 

      writer.WriteEndElement(); // </parts> 
     } 
     writer.WriteEndElement(); // </MyParts> 
     writer.WriteEndDocument(); 

     writer.Flush(); 
     writer.Close(); 

    } 

L'idée générale est que, pour chaque partie dans la liste des pièces, vous écrivez les « parties » (qui devrait être " ? partie ") étiquette et tout son contenu, le remplissage item, color et size avec les données d'une classe Part, qui, dans sa forme la plus simple pourrait être:

class Part 
{ 
    public string Item { get; set; } 
    public Color Color { get; set; } 
    public string Size { get; set; } 
} 
+0

Je reçois des erreurs, mais je vais continuer à essayer. –

+0

Quelles sont les erreurs, spécifiquement? –

0

Le code ci-dessus ne exactement à quoi il ressemble: écrit un élément "MyParts" puis écrit un élément enfant "parties" puis un élément enfant "élément" avec une valeur de tout ce qui est dans votre zone de texte. Cela ressemble étrangement aux devoirs, et est facilement utilisable sur Google, donc je vais seulement donner une pseudo-réponse rapide.

Vous (Mai):

  1. Créer une classe appropriée (s) pour les pièces qui ont les membres que vous souhaitez
  2. Créer une collection de ces articles
  3. jour que dans la mémoire collection de votre interface utilisateur
  4. Enregistrez la collection en utilisant la mise en forme XML et les fonctionnalités de votre choix (y compris, mais sans s'y limiter, ce que vous faites ci-dessus, ou LINQ to XML, ou XML Serialization, ou ...
+0

Je pensais que l'édition d'un fichier xml allait être facile. J'ai googlé pendant des jours maintenant, ce qui décrit probablement le mieux mon niveau de compétence. Je ne savais même pas par où commencer, mais finalement je suis arrivé à xmlwriter qui a fonctionné (comme vous le savez) mais ensuite on m'a pointé sur XmlDocument. Tout ce que j'ai essayé écrase toujours mais ne s'ajoute pas. J'ai vu LINQ to XML pendant ma recherche, alors sache que je vais chercher ça. Je vais également vérifier la sérialisation XML. –

0

Avez-vous envisagé d'utiliser la sérialisation XML fournie avec .NET? Vous venez de remplir vos objets dans une collection, puis d'utiliser XML Serializer pour persister dans un fichier. Vous pouvez ensuite utiliser le DeSerializer pour hydrater vos objets.

Cela vous permet de passer plus de temps sur l'interface utilisateur de votre application (WPF) et sur sa logique. Tout ce que vous devez faire est tout l'attribut Serializable de votre classe.

Voici un bon exemple: http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

Le plus grand avantage est que vous construisez votre objet de données au fil du temps, la sérialisation/désérialisation vont grandir avec elle. Diriez-vous que LINQ to XML est le meilleur moyen de créer et d'éditer des fichiers xml en utilisant C#?