Lors de la génération de XML à partir de XmlDocument dans .NET, un xmlns
attribut vide apparaît la première fois qu'un élément sans espace de noms associé est inséré; comment peut-on é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);
Production:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Sortie souhaitée :
<root xmlns="whatever:name-space-1.0"><loner /></root>
Existe-t-il une solution applicable au XmlDocument
code, pas quelque chose qui se produit après la conversion du document en chaîne avec OuterXml
?
Mon raisonnement pour faire 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' xmlns
attribut vide peut ne pas casser ou confondre un analyseur, mais il n'est pas non plus présent dans les utilisations que j'ai vues de ce protocole.
la source
doc.DocumentElement.NamespaceURI
) mais ne spécifiez pas d'espace de nom pourCreateAttribute()
vous obtiendrez lexmlns:psomething
même s'il s'agit du même uri.Ceci est une variante de la réponse de JeniT (Merci beaucoup btw!)
Cela évite d'avoir à copier ou répéter l'espace de noms partout.
la source
Si l'
<loner>
élément de votre exemple de XML ne contenait pas laxmlns
déclaration d'espace de noms par défaut, il se trouverait dans l'whatever:name-space-1.0
espace de noms plutôt que dans aucun espace de noms. Si c'est ce que vous voulez, vous devez créer l'élément dans cet espace de noms:Si vous voulez que l'
<loner>
élément se trouve dans aucun espace de noms, alors le XML qui a été produit est exactement ce dont vous avez besoin, et vous ne devriez pas vous soucier de l'xmlns
attribut qui a été ajouté automatiquement pour vous.la source
Puisque root est dans un espace de noms sans préfixe, tout enfant de root qui veut être sans espace de noms doit être affiché comme dans votre exemple. La solution serait de préfixer l'élément racine comme ceci:
code:
la source
Si possible, créez une classe de sérialisation puis faites:
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.
la source
J'ai résolu le problème en utilisant le modèle d'usine. J'ai créé une fabrique pour les objets XElement. En tant que paramètre pour l'instanciation de l'usine, j'ai spécifié un objet XNamespace. Ainsi, à chaque fois qu'un XElement est créé par la fabrique, l'espace de noms sera ajouté automatiquement. Voici le code de l'usine:
la source
XmlDocument
, nonXDocument
.Oui, vous pouvez empêcher le XMLNS de XmlElement. Le temps de la première création arrive: comme ça
Changez le code: et passez l'espace de noms XML comme ceci
Code C #:
la source