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

Lors de la génération de XML à partir de XmlDocument dans .NET, un atsortingbut xmlns vide apparaît la première fois qu’un élément sans espace de noms associé est inséré; comment cela peut-il être évité?

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:

  

Sortie souhaitée :

  

Existe-t-il une solution applicable au code XmlDocument , pas quelque chose qui se produit après la conversion du document en chaîne avec OuterXml ?

Mon raisonnement pour cela est de voir si je peux faire correspondre le XML standard d’un protocole particulier en utilisant le XML généré par XmlDocument. L’atsortingbut xmlns vide peut ne pas casser ou confondre un parsingur, mais il n’est pas non plus utilisé dans les utilisations de ce protocole.

Grâce à la réponse de Jeremy Lew et à un peu plus de jeu, j’ai compris comment supprimer les atsortingbuts xmlns vides: passez dans l’espace de noms du nœud racine lors de la création de tout nœud enfant sur lequel vous ne voulez pas de préfixe. Utiliser un espace de noms sans préfixe à la racine signifie que vous devez utiliser le même espace de noms sur les éléments enfants pour 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’ont conduit dans la bonne direction!

Ceci est une variante de la réponse de JeniT (Merci beaucoup btw!)

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

Cela évite d’avoir à copier ou à répéter l’espace de noms partout.

Si l’élément de votre exemple XML ne xmlns pas la déclaration d’espace de noms xmlns par défaut, il se trouverait dans l’ whatever:name-space-1.0 plutôt que dans un espace de noms. 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 que l’élément ne se trouve dans aucun espace de noms, le XML produit est exactement ce dont vous avez besoin, et vous ne devriez pas vous soucier de l’atsortingbut xmlns ajouté automatiquement pour vous.

Puisque root se trouve dans un espace de noms non préfixé, tout enfant de root qui souhaite ne pas avoir de noms de domaine doit être affiché comme votre exemple. La solution serait de préfixer l’élément racine comme suit:

    

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); 

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 atsortingbuts si vous avez vraiment besoin de plus de contrôle.

J’ai résolu le problème en utilisant le motif d’usine. J’ai créé une fabrique d’objects XElement. En tant que paramètre de l’instanciation de la fabrique, j’ai spécifié un object XNamespace. Ainsi, chaque fois qu’un XElement est créé par la fabrique, l’espace de noms sera automatiquement ajouté. Voici le code de l’usine:

 internal class XElementFactory { private readonly XNamespace currentNs; public XElementFactory(XNamespace ns) { this.currentNs = ns; } internal XElement CreateXElement(Ssortingng name, params object[] content) { return new XElement(currentNs + name, content); } } 

Oui, vous pouvez empêcher le XMLNS de XmlElement. Première création du temps à venir: comme ça

  249.118774   

Changer le code: Et passer un espace de noms XML comme ceci

Code C #:

 XmlElement bookElement = xdoc.CreateElement("trkpt", "http://www.topografix.com/GPX/1/1"); bookElement.SetAtsortingbute("lat", "30.53597"); bookElement.SetAtsortingbute("lon", "97.753324");