116 votes

Comment empêcher les attributs xmlns vides dans la sortie de XmlDocument de .NET ?

Lorsque l'on génère du XML à partir de XmlDocument dans .NET, un fichier vide xmlns apparaît la première fois qu'un élément sans un espace de nom associé est inséré ; comment éviter cela ?

Exemple :

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root",
    "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner"));
Console.WriteLine(xml.OuterXml);

Sortie :

<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>

Souhaitée Sortie :

<root xmlns="whatever:name-space-1.0"><loner /></root>

Existe-t-il une solution applicable à la XmlDocument et non pas quelque chose qui se produit après convertir le document en une chaîne de caractères avec OuterXml ?

Mon raisonnement est de voir si je peux faire correspondre le XML standard d'un protocole particulier en utilisant le XML généré par XmlDocument. Le fichier vierge xmlns attribut mai ne pas casser ou confondre un analyseur, mais il n'est pas non plus présent dans toutes les utilisations que j'ai vues de ce protocole.

107voto

Neil C. Obremski Points 3747

Merci à Jeremy Lew réponse et un peu plus de jouer, j'ai compris comment faire pour supprimer vide xmlns attributs: passer dans le nœud racine de l'espace de noms lors de la création de tout enfant du nœud que vous voulez pas d'avoir un préfixe. À l'aide d'un espace de noms sans préfixe à la racine signifie que vous devez utiliser le même espace de noms sur des éléments d'enfant pour eux aussi de ne pas avoir de préfixes.

Code Fixe:

XmlDocument xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("root", "whatever:name-space-1.0"));
xml.DocumentElement.AppendChild(xml.CreateElement("loner", "whatever:name-space-1.0")); 
Console.WriteLine(xml.OuterXml);

Merci à tous pour toutes vos réponses, qui m'a conduit dans la bonne direction!

85voto

C Johnson Points 4900

Il s'agit d'une variante de la réponse de JeniT (merci beaucoup !).

XmlElement new_element = doc.CreateElement("Foo", doc.DocumentElement.NamespaceURI);

Cela évite de devoir copier ou répéter l'espace de nom partout.

10voto

JeniT Points 3030

Si le <loner> dans votre exemple XML n'avait pas l'élément xmlns de l'espace de nom par défaut, alors il se trouverait dans l'espace de nom par défaut. whatever:name-space-1.0 plutôt que d'être dans aucun espace de nom. Si c'est ce que vous voulez, vous devez créer l'élément dans cet espace de noms :

xml.CreateElement("loner", "whatever:name-space-1.0")

Si vous voulez le <loner> n'est pas dans un espace de nom, alors le XML qui a été produit est exactement ce dont vous avez besoin, et vous ne devriez pas vous soucier de l'élément xmlns qui a été ajouté automatiquement pour vous.

7voto

jlew Points 5666

Puisque Root se trouve dans un espace de noms sans préfixe, tout enfant de Root qui veut être sans espace de noms doit être produit comme dans votre exemple. La solution serait de préfixer l'élément Root comme suit :

<w:root xmlns:w="whatever:name-space-1.0">
   <loner/>
</w:root>

code :

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement( "w", "root", "whatever:name-space-1.0" );
doc.AppendChild( root );
root.AppendChild( doc.CreateElement( "loner" ) );
Console.WriteLine(doc.OuterXml);

0voto

ilitirit Points 4636

Si possible, créez une classe de sérialisation puis faites :

XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
XmlSerializer serializer = new XmlSerializer(yourType);
serializer.Serialize(xmlTextWriter, someObject, ns);

C'est plus sûr, et vous pouvez contrôler les espaces de noms avec des attributs si vous avez vraiment besoin de plus de contrôle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X