2010-03-23 20 views
4

J'essaie de convertir un document XML d'un format à un autre et, ce faisant, j'ai trouvé que j'avais besoin d'insérer plusieurs déclarations xmlns dans l'élément racine.J'ai besoin de plusieurs éléments xmlns dans un élément avec le XmWriter

Exemple:

< xml version = "1.0" encoding = "utf-8"? >
< modèle xmlns = "http://tempuri.org/TemplateBase.xsd" xmlns: TYPES = "http://tempuri.org/TemplateTypes.xsd" >
certains contenus
< Modèle >

La raison de tout cela est que j'ai divisé le schéma XSD en plusieurs XSD afin de réutiliser les types généraux dans ce cas.

Eh bien, ce que je veux faire maintenant est d'écrire ce fichier XML avec un XmlTextWriter mais je ne peux pas écrire l'attribut xmlns pour les TYPES.

Ce que j'ai essayé jusqu'à présent est:

XmlWriter xmlWriter = XmlWriter.Create(filename, settings); 
xmlWriter.WriteStartElement("Template", "http://tempuri.org/TemplateBase.xsd"); 
xmlWriter.WriteAttributeString("xmlns", "TYPES", "http://tempuri.org/TemplateTypes.xsd", XmlSchema.InstanceNamespace); 

Lorsque j'exécute ce code, je reçois l'exception suivante:
System.ArgumentException: préfixe "xmlns" est réservée à une utilisation par XML ..

Est-ce que quelqu'un a un remède à mon mal de tête actuel?

Répondre

7

Utilisez

xmlWriter.WriteAttributeString("xmlns", "TYPES", 
    null, "http://tempuri.org/TemplateTypes.xsd"); 

au lieu de

xmlWriter.WriteAttributeString("xmlns", "TYPES", 
    "http://tempuri.org/TemplateTypes.xsd", XmlSchema.InstanceNamespace); 

Cela devrait vous donner la sortie désirée.

+0

Merci Doc, qui a fait l'affaire! –

0

C'est très simple. N'écrivez pas les attributs xmlns. Au lieu de cela, vous devriez écrire vos attributs et éléments dans l'espace de noms auquel ils appartiennent. XmlWriter s'occupera des déclarations d'espace de noms (attributs xmlns) par lui-même.

+0

Cela va produire du XML valide, mais je pense que vous obtenez l'URI de l'espace de noms complet incorporé dans chaque élément XML, donc cela conduira à * très * gros fichiers de sortie. –

+0

Je voulais que les xmlns dans la déclaration facilitent pour les utilisateurs finaux qui éditeront le xml à la main un jour. –