2010-05-07 2 views
2

Salut Je veux copier un fichier XML et insérer dans un élément spécifique locaiton plus d'éléments; Quelle est la meilleure et la plus simple façon de procéder? Je peux utiliser des éléments de lecture de xmlReader et écrire un à un en me référant à chaque type - j'ai eu quelques problèmes avec cela mais à part cela cela me semble trop dur de faire mieux. dans l'exemple ci-dessous J'ai le xml comme définition par défaut besoin de créer un nouveau xml dans le même format avec l'insertion de nouvelles valeurs à sheet1 - mais après les lignes existantes, et faire la même chose pour sheet2.Copie d'un fichier xml avec l'insertion de nouveaux éléments dans un emplacement spécifique - C#

<book> 
    <Sheet ss:name="Sheet1"> 
     <Table > 
     <Row > 
     <Cell/> 
     <Cell> 
      Title Name  
     </Cell> 
     <Cell > 
      Title Description 
     </Cell> 
     </Row> 
    </Sheet> 
<a/> 
<b/> 
    <Sheet ss:name="Sheet2"> 
     <Table > 
     <Row > 
     <Cell/> 
     <Cell> 
      Title Name  
     </Cell> 
     <Cell > 
      Title Description 
     </Cell> 
     </Row> 
    </Sheet> 
</book> 

Répondre

7

La vue de ma façon simple serait de charger le document entier en utilisant LINQ to XML, le modifier, puis enregistrez-le à nouveau. Ce sera probablement plus facile que d'utiliser XmlReader, qui peut devenir un peu poilu dans mon expérience. Cependant, cela implique de tout charger dans la mémoire - ce qui pourrait être un problème si les documents sont énormes. Est-ce que cela risque d'être un problème?

EDIT: Voici un court exemple dans LINQ to XML (non testé):

XDocument doc = XDocument.Load("test.xml"); 
XNamespace ss = "http://url/for/ss"; 
Sheet sheet1 = doc.Descendants("Sheet") 
        .Where(x => (string) x.Attribute(ss + "name") == "Sheet1"); 
XElement lastRow = sheet1.Elements("Row").LastOrDefault(); 
// Note: if there aren't any rows, lastRow will be null here. Handle accordingly 
lastRow.AddAfterSelf(new XElement("Foo", "Extra value")); 

Une alternative à la dernière partie, si vous voulez juste le nouveau contenu après tout l'ancien contenu de la feuille:

sheet1.Add(new XElement("Foo", "Extra value")); 
+0

Semble, le fichier xmlFormat d'origine n'est pas énorme, tandis que les résultats finaux peuvent contenir quelques Mo. Avoir des liens/exemples de la façon de le faire en utilisant linq. J'ai besoin d'obtenir toutes les données jusqu'à ce que l'élément trouvé (shhet dans l'exemple) le copie au nouveau xml, insère de nouvelles données, et copie toutes les données après l'élément désiré. Merci de votre aide!!! De plus, qu'est-ce que la comparaison des avantages/désavantages entre xmlReader ou linq à xml dans ce cas? – user271077

+0

Vous n'avez pas besoin de faire de copie si vous lisez toute la chose en mémoire: il suffit de modifier l'arbre de manière appropriée, puis enregistrez-le ensuite. L'avantage de LINQ à XML par rapport à XmlReader est que le code sera beaucoup plus simple. L'inconvénient est que vous * aurez * toutes les données en mémoire. Quelques MB ne devraient pas poser de problème du tout. Je vais écrire un petit exemple de ce que vous pourriez faire. –

+0

Merci, j'apprécie. De quelle taille de fichier devrais-je être concerné? – user271077

Questions connexes