2010-10-28 7 views
1

dire J'ai un fichier xml comme celui-ci:Fusion de deux fichiers xml en C# sans ajouter et sans rien supprimer (exemple donné)

<shapes> 
    <shape>shape1</shape> 
</shapes> 

Et un autre fichier xml comme ceci:

<parentNode> 
    <shapes> 
     <shape>shape 2</shape> 
    </shapes> 
</parentnode> 

Je voudrais que la sortie soit:

<parentNode> 
    <shapes> 
     <shape>shape1</shape> 
     <shape>shape 2</shape> 
    </shapes> 
</parentnode> 

le contexte est que je suis en utilisant le schéma de visio, mais je souhaite le fichier de configuration pour un n application qui écrit des fichiers visio xml pour être une version dépouillée d'un fichier visio config. Cela devrait permettre aux utilisateurs de changer les propriétés de forme, par ex. "processus" pour avoir une couleur jaune ET il devrait leur permettre d'ajouter de nouvelles formes par exemple "AccountsTable" que l'application va rechercher avant d'utiliser une forme standard et utiliser la forme personnalisée à la place dans certaines circonstances.

En termes de fusion, il faut essentiellement coller les bons nœuds feuilles aux bons endroits si cela a du sens? Sans écraser quoi que ce soit à moins que le fichier de configuration n'ait été explicitement écrit pour le faire, par ex. une "forme 2" personnalisée.

À quoi dois-je m'attendre pour y parvenir? La méthode de jeu de données est plutôt inutile.

Merci beaucoup !!!

Répondre

0

Pssuedo code, je devine les noms de méthodes.

... 
xmlreader xmlToMerge1 = xmlreader.create(XmlSourceVariableHere); 
xmlreader xmlToMerge2 = xmlreader.create(XmlSourceVariableToMergeHere); 
xmlwriter xmlout = new xmlwriter(someStreamOrOther); 

xmlout.writeBeginElement("parentnode"); 
xmlout.writeBeginElement("shapes"); 

while (xmlToMerge1.Read()) 
{ 
if (xmlreader.nodetype == element && xml.Name == "shape") 
    { 
    xmlToMerge1.WriteNodeTo(xmlout); 
    } 
} 

while (xmlToMerge2.Read()) 
{ 
if (xmlToMerge2.nodetype == element && xmlToMerge2.Name == "shape") 
    { 
    xmlToMerge2.WriteNodeTo(xmlout); 
    } 
} 


xmlout.writeEndNode(); // end shapes 
xmlout.writeEndNode(); // end parentnode 

Je me souviens qu'il ya une commande pour écrire un nœud d'un lecteur à un écrivain, mais je ne me rappelle pas ce qu'il est précisément, vous devrez regarder que un.

Qu'entendez-vous exactement par ce qui suit?

En termes de la fusion, il faut essentiellement coller les nœuds feuilles droite dans les bons endroits si cela fait sens? Sans écraser quoi que ce soit sauf si le fichier de configuration a été explicitement écrit pour ce faire, par ex. une "forme personnalisée" 2 ".

Vous devrez expliquer vos besoins un peu plus si vous voulez une réponse plus détaillée que la simple fusion de nœuds.

+0

Désolé, pour être clair, il n'y a aucune connaissance supposée de l'un des noms de noeuds.Donc ce que je veux dire en ce qui concerne les nœuds de feuille est s'il y a deux branches dans les deux arbres avec des noeuds identiques en dehors des feuilles puis les feuilles sont ajoutées à une branche (mais rien n'est remplacé). –

+0

Je vois. Quelle est la taille des documents XML? Cela affecterait-il les performances pour utiliser un analyseur de style DOM? – wllmsaccnt

1

Vous pouvez charger les deux fichiers dans deux objets XElement, localiser les noeuds cibles dans les deux objets et les ajouter ou les supprimer comme vous le souhaitez.

Voici un exemple:

var doc1 = XDocument.Parse(file1).Element("shapes"); 
var doc2 = XDocument.Parse(file2).Element("parentNode").Element("shapes"); 

doc2.Add(doc1.Nodes()); 
0

Je ne pense pas qu'il y ait une solution facile. Considérant que vous n'êtes pas limité à fusionner le contenu du noeud Formes, je pense que vous devrez parcourir les nœuds de l'un des documents de manière récursive, en vérifiant si chacun de ces nœuds est présent dans l'autre document via XPath. Et une fois que vous avez trouvé un nœud commun dans les deux documents, vous pouvez fusionner le contenu de l'un dans l'autre. Ce n'est pas efficace et il y a peut-être un meilleur moyen mais c'est le meilleur que je puisse penser.

Questions connexes