Syntaxe de sortie du CreateNode() non modifiable

GG1983 Messages postés 2 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 12 janvier 2012 - 7 janv. 2012 à 18:35
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 13 janv. 2012 à 07:06
Bonjour,

Dans un programme en C#, j'explore des fichiers xml existants avec une structure existante que je dois respecter et je souhaite ajouter des noeuds. Mon problème est que Visual Studio ne me laisse pas écrire la syntaxe que je souhaite.

Je cherche à écrire un noeud qui aurait la forme :
Mon contenu


Le mieux que j'arrive à obtenir est (Comme vous pouvez le voir, il manque ab: et il y a en trop xmlns= "".) :
 Mon contenu 


Mon code est le suivant :
  XmlNode noeudsup  = MonDocXmlDocument.CreateNode(XmlNodeType.Element, "ab:balise", "");
  noeudsup.InnerText = "Mon contenu";
  noeudparent.AppendChild(noeudsup);


MSDN me dit que si je met un XmlNode.Name qui contient le symbole ":", il le découpera en Prefix + LocalName. Soit mais moi j'ai besoin de trouver un contournement car tous les fichiers existants et futurs ont besoin de cette structure "ab:balise".
--> Quelqu'un a une idée à proposer pour que j'ai ma balise complète ?

Pour le NamespaceURI, que je mette une chaine vide ou bien que j'utilise le NamespaceURI du noeud parent ou du document, rien à faire, il me rajoute à chaque fois l'attribut xmlns que je ne peut même pas supprimer par un XmlNode.Attributes.RemoveAll()
--> Quelqu'un a une idée à proposer pour supprimer cet "attribut" ?

J'ai pas mal cherché sur internet mais rien, j'ai même essayé en mode XmlNodeType.Text mais ça ne marche pas. J'aimerai bien trouver une solution pour éviter de modifier une partie par les méthodes de System.Xml puis de remodifier le fichier avec un System.IO.StreamWriter.

merci,
A+

3 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 10:25
toi, tu n'as pas lu la doc...

quel est ce troisième argument de CreateNode que tu transmets vide ?

ce ab: ne fait pas partie du nom... c'est le namespace

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
GG1983 Messages postés 2 Date d'inscription dimanche 9 janvier 2011 Statut Membre Dernière intervention 12 janvier 2012
12 janv. 2012 à 22:44
Bonjour,

sisi j'ai bien lu la doc et c'est pour ça que j'ai rajouté :
Pour le NamespaceURI, que je mette une chaine vide ou bien que j'utilise le NamespaceURI du noeud parent ou du document, rien à faire


mon namespace dans le document n'est pas ab, il est bien plus long que ça mais il ne m'interesse pas. Je n'ai pas le choix, je dois respecter la structure des balises donc je veux que le programme m'écrive mes noms de balise du style
Mon contenu


D'ailleurs quand je fais une lecture par le XmlTextReader d'un fichier existant, il me donne bien dans le XmlNode.Name une string qui vaut ab:balise et non uniquement balise, preuve que le : dans le nom de balise ne le choque pas tout le temps.

Pour l'instant j'ai utilisé une méthode très bourrine, j'ai mis une chaine de remplacement du type ààààà à la place de ab: et une fois le xml modifié, je rouvre le fichier en mode texte et je remplace toutes les occurences de ààààà par ab:

A+
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
13 janv. 2012 à 07:06
Pas eu de souci ni de message d'erreur particulier...

XmlDocument XML = new XmlDocument();
            XML.AppendChild(XML.CreateXmlDeclaration("1.0", "ISO-8859-1", String.Empty));
            XmlNode noeudparent = XML.CreateNode(XmlNodeType.Element, "ab", "Racine", "urn:AB");
            XML.AppendChild(noeudparent);
            XmlNode noeudsup = XML.CreateNode(XmlNodeType.Element, "ab", "balise", "urn:AB");
            noeudsup.InnerText = "Mon contenu";
            noeudparent.AppendChild(noeudsup);
            XML.Save("out.xml");


possible aussi de faire :

XmlDocument XML = new XmlDocument();
            XML.AppendChild(XML.CreateXmlDeclaration("1.0", "ISO-8859-1", String.Empty));
            XmlNamespaceManager NS = new XmlNamespaceManager(XML.NameTable);
            NS.AddNamespace("ab", "urn:AB");
            XmlNode noeudparent = XML.CreateNode(XmlNodeType.Element, "ab", "Racine", NS.LookupNamespace("ab"));
            XML.AppendChild(noeudparent);
            XmlNode noeudsup = XML.CreateNode(XmlNodeType.Element, "ab", "balise", noeudparent.NamespaceURI);
            noeudsup.InnerText = "Mon contenu";
            noeudparent.AppendChild(noeudsup);
            XML.Save("out.xml");


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0