Création d'un document Xml à partir d'un autre [Résolu]

cs_cfz 23 Messages postés vendredi 13 janvier 2006Date d'inscription 26 octobre 2015 Dernière intervention - 4 mars 2006 à 14:46 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 4 mars 2006 à 16:16
Bonjour,
j'ai un document Xml qui me sert de template pour en créer d'autres

j'ouvre le document template :

XmlDocument XmlTemplate =
new
XmlDocument();
XmlTemplate.Load(
"Template.xml");

Je créé un nouveau document Xml vide


XmlDocument XmlFinal =
new
XmlDocument();
XmlFinal.AppendChild(XmlFinal.CreateXmlDeclaration(
"1.0",
null,
null));
XmlNode XmlRoot = XmlFinal.CreateElement(
"Racine");

Je récupère les noeuds du document Xml pour les mettre dans mon document Xml final


foreach (
XmlNode XmlNodeLoc
in XmlTemplate.DocumentElement.ChildNodes)
{
XmlRoot.AppendChild(XmlNodeLoc); <--- ne marche pas...
ArgumentException was unhandled : The node to be inserted is from a different document context.

}

Que dois-je faire ?
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 4 mars 2006 à 16:04
3
Merci
Je pense qu'il y a moyen de faire autrement mais je ne maitrise pas encore tous les aspects des manipulations Xml.

Sinon j'avais complètement oublier l'existence de la méthode XmlDocument.ImportNode, qui devrait résoudre ton problème sans tuer les performances avec InnerXml.

Copie de noeuds existants d'un document à un autre

/*
coq
MVP Visual C#
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 4 mars 2006 à 14:51
0
Merci
Salut,

Et avec la méthode XmlNode.CloneNode ?

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
cs_cfz 23 Messages postés vendredi 13 janvier 2006Date d'inscription 26 octobre 2015 Dernière intervention - 4 mars 2006 à 14:57
0
Merci
Même problème, même exception :'(


XmlRoot.AppendChild(XmlNodeLoc.CloneNode(
true));
Commenter la réponse de cs_cfz
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 4 mars 2006 à 15:07
0
Merci
Ok.
Sert toi de InnerXml ou OuterXml alors.
Je ne sais pas ce que ça peut donner sur les perfs ensuite, mais je ne connais pas d'autre méthode pour "passer" un noeud d'un document à l'autre.

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 4 mars 2006 à 15:13
0
Merci
Euh, j'ai un doute là : ton document final sera donc un clone du modèle non (mis à part les données, les noeuds supplémentaires etc) ?

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq
cs_cfz 23 Messages postés vendredi 13 janvier 2006Date d'inscription 26 octobre 2015 Dernière intervention - 4 mars 2006 à 15:40
0
Merci
Oui c'est bien ça... malheureusement OuterXml est en lecture seule, la solution que je retiens donc pour le moment est d'utiliser InnerXml, puis de copier les attributs les uns après les autres à l'aide d'un foreach.

pour info j'explique un peu mieux mon cas... (ptet que je m'y prend mal)

j'ai un document XmlTemplate qui dois me servir de base (simplifié ici au minimum... en effet, il est prévu d'y ajouter de nouveaux sous-noeuds au fur et à mesure de l'avancement du développement) :
XmlTemplate :

<?xml version="
1.0"
encoding="
utf-8"
?>
<Seasons>
<Season Identifiant=""
>
<Description></Description>
<Periodes>
<!--

-->
</Periodes>
</Season>
</Seasons>

Celui-ci me permet de générer un document XmlSeasons.Xml comprenant plusieurs noeuds <Season>.
Ainsi, à chaque fois que l'utilisateur décide d'ajouter une "saison", je copie l'ensemble des noeuds de XmlTemplate à la fin de XmlSeasons.Xml (en y ajoutant bien entendu les bon paramètres (description, identifiant, etc...).

Merci en tout cas pour ton aide.
Commenter la réponse de cs_cfz
cs_cfz 23 Messages postés vendredi 13 janvier 2006Date d'inscription 26 octobre 2015 Dernière intervention - 4 mars 2006 à 16:05
0
Merci
Pour info, voilà la fonction que j'ai écrite, question performence je n'ai fait aucun test... je ferais les tests plus tard.. lorsque j'aurais suffisamment avancé sur mon projet



/// <summary>
/// Fonction permettant d'ajouter un noeud Xml quelconque à un document Xml
/// </summary>
/// Document Xml où l'on ajoute le noeud

/// Noeud Xml devant être copié

/// <returns></returns>
public
static
XmlNode AppendChildOutside(
XmlDocument XmlDoc,
XmlNode XmlChildOutside)
{

XmlNode XmlChild =
null;

XmlAttribute XmlAttrib =
null;

#region Création du nouveau noeud
XmlChild = XmlDoc.CreateElement(XmlChildOutside.Name);
XmlChild.InnerXml = XmlChildOutside.InnerXml;

#region Ajout des attributs

foreach (
XmlAttribute XmlAttribOutside
in XmlChildOutside.Attributes)
{
XmlAttrib = XmlDoc.CreateAttribute(XmlAttribOutside.Name);
XmlAttrib.InnerXml = XmlAttribOutside.InnerXml;
XmlChild.Attributes.Append(XmlAttrib);
}

#endregion
#endregion
return XmlChild;
}
Commenter la réponse de cs_cfz
cs_cfz 23 Messages postés vendredi 13 janvier 2006Date d'inscription 26 octobre 2015 Dernière intervention - 4 mars 2006 à 16:10
0
Merci
Bien vu ;)
il ne me reste plus qu'a remplacer la fonction que je viens d'écrire ;)
ca marche nickel avec ImportNode

ca me paraissait bizarre qu'une telle fonction n'existait pas ;)
Merci pour tou++
Commenter la réponse de cs_cfz
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 4 mars 2006 à 16:16
0
Merci
Oui moi aussi ^^

PS : j'ai retirer la réponse acceptée sur l'utilisation de InnerXml, qui du coup est devenue totalement ridicule

/*
coq
MVP Visual C#
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.