2010-04-15 5 views
3

J'ai un fichier XML existant que j'aimerais ajouter sans modifier le format. Le fichier existant ressemble à ceci:Ajout d'un fichier XML existant

<Clients> 
    <User username="farstucker"> 
    <UserID>1</UserID> 
    <DOB /> 
    <FirstName>Steve</FirstName> 
    <LastName>Lawrence</LastName> 
    <Location>NYC</Location> 
    </User> 
</Clients> 

Comment puis-je ajouter un autre utilisateur en utilisant ce format? Mon code existant est:

 string fileLocation = "clients.xml"; 

     XmlTextWriter writer; 

     if (!File.Exists(fileLocation)) 
     { 
      writer = new XmlTextWriter(fileLocation, null); 
      writer.WriteStartDocument(); 

      // Write the Root Element 
      writer.WriteStartElement("Clients"); 

      // End Element and Close 
      writer.WriteEndElement(); 
      writer.Close(); 
     } 
// Append new data here 

Ive pensé à l'aide XmlDocument Fragment pour ajouter les données, mais je ne suis pas certain si je peux maintenir le format actuel (et balises vides) sans déconner le fichier.

Tout conseil que vous pourriez donner est très apprécié.

EDIT Ive a changé le code pour lire le XML original mais le fichier ne cesse écrasé.

+2

N'utilisez pas 'new XmlTextWriter()'. Cela a été déprécié depuis .NET 2.0. Utilisez 'XmlWriter.Create()' à la place. –

Répondre

4

Vous devez utiliser la classe XmlDocument pour charger tout le fichier, le modifier en mémoire, puis d'écrire le contenu remplaçant de nouveau le fichier d'origine. Ne vous inquiétez pas, cela ne gâchera pas votre balisage, et vous pouvez même lui demander de conserver les espaces non significatifs dans le document original en utilisant la propriété PreserveWhitespace (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx).

+3

Je suis d'accord avec ce que dit kicsit, sauf pour la partie où il dit "XmlDocument", vous voulez utiliser XDocument et Linq pour XML, car il est nettement plus agréable et plus facile de travailler avec. Il y a une méthode de chargement statique pour lire le document du fichier et une sauvegarde équivalente. – Murph

+0

Je crois que la plupart de la question ne précise pas quelle version de .NET ils utilisent. LINQ n'existe pas dans la version 2.0 ou les versions précédentes. – Nayan

+0

Désolé, Im using 3.5 – Ryan

1

Vous pouvez essayer quelque chose comme ça ...

 string fileLocation = "clients.xml"; 

     if (!File.Exists(fileLocation)) 
     { 
      XmlTextWriter writer = new XmlTextWriter(fileLocation, null); 
      writer.WriteStartElement("Clients"); 
      writer.WriteEndElement(); 
      writer.Close(); 
     } 

     // Load existing clients and add new 
     XElement xml = XElement.Load(fileLocation); 
      xml.Add(new XElement("User", 
      new XAttribute("username", loginName), 
      new XElement("DOB", dob), 
      new XElement("FirstName", firstName), 
      new XElement("LastName", lastName), 
      new XElement("Location", location))); 
     xml.Save(fileLocation); 

Cela devrait vous aider à démarrer, il suffit de remplacer les variables avec ce que vous utilisez et ne pas oublier d'ajouter l'espace de noms System.Xml.Linq.

Si vous êtes toujours des problèmes republier ici et bien vous aider à passer au travers.

0

Si vous souhaitez utiliser la sérialisation (ce qui signifie que vous souhaitez sérialiser un objet de données dans XML et l'ajouter à un fichier XML existant), vous pouvez utiliser cette méthode générique SerializeAppend<T>. Il fait exactement ce dont vous avez besoin. J'ai également ajouté deux autres méthodes pour toute personne qui pourrait bénéficier

public static void Serialize<T>(T obj, string path) 
{ 
    var writer = new XmlSerializer(typeof(T)); 

    using (var file = new StreamWriter(path)) 
    { 
     writer.Serialize(file, obj); 
    } 
} 


public static T Deserialize<T>(string path) 
{ 
    var reader = new XmlSerializer(typeof(T)); 
    using (var stream = new StreamReader(path)) 
    { 
     return (T)reader.Deserialize(stream); 
    } 

} 

public static void SerializeAppend<T>(T obj, string path) 
{ 
    var writer = new XmlSerializer(typeof(T)); 

    FileStream file = File.Open(path, FileMode.Append, FileAccess.Write); 

    writer.Serialize(file, obj); 

    file.Close(); 
} 
+0

avec ceci il s'ajoutera avec le même espace de noms encore .. il ne s'ajoutera pas au dernier noeud enfant mais il ajouterait seulement à la fin de document –

Questions connexes