Comment prévenir vide xmlns attributs en sortie de .NET XmlDocument?
Lors de la génération de XML à partir d'XmlDocument dans .NET, un vide xmlns
attribut apparaît la première fois qu'un élément sans associé à un espace de noms 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);
De sortie:
<root xmlns="whatever:name-space-1.0"><loner xmlns="" /></root>
Souhaité De Sortie:
<root xmlns="whatever:name-space-1.0"><loner /></root>
Est-il une solution applicable à l' XmlDocument
code, pas quelque chose qui se produit après la conversion du document à une chaîne avec OuterXml
?
Mon raisonnement pour le faire, c'est pour voir si je peux correspondre à la norme XML d'un protocole particulier à l'aide de XmlDocument-XML généré. Le vide xmlns
attribut peut pas casser ou de confondre un analyseur syntaxique, mais c'est aussi ne sont pas présents dans l'utilisation que j'en ai vu de ce protocole.
Vous devez vous connecter pour publier un commentaire.
Grâce à 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 de aussi de ne pas avoir de préfixes.Code Fixe:
Merci à tous pour toutes vos réponses, qui m'a conduit dans la bonne direction!
doc.DocumentElement.NamespaceURI
) mais ne spécifiez pas un espace de noms pourCreateAttribute()
vous aurez laxmlns:psomething
même si c'est la même uri.C'est une variante de JeniT réponse (Merci beaucoup btw!)
Cela évite d'avoir à les copier ou de les répéter à l'espace de noms de partout.
Si le
<loner>
élément dans votre échantillon XML n'ont pas lexmlns
déclaration d'espace de noms, alors qu'il serait dans l'whatever:name-space-1.0
espace de noms plutôt que d'être dans aucun espace de noms. Si c'est ce que vous voulez, vous devez créer l'élément dans l'espace de nom:Si vous voulez le
<loner>
élément à être dans aucun espace de noms, puis le code XML qui a été produit est exactement ce dont vous avez besoin, et vous ne devriez pas vous soucier de laxmlns
attribut qui a été ajouté automatiquement pour vous.Depuis la racine est dans un unprefixed espace de noms, tout enfant de la racine qui veut être non-préfixée doit être de sortie, comme votre exemple. La solution serait de faire précéder l'élément racine de la sorte:
code:
Si possible, créer une sérialisation de la classe alors:
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.
J'ai résolu le problème en utilisant le Modèle de Fabrique. J'ai créé une usine de XElement objets. En tant que paramètre pour l'instanciation de l'usine j'ai spécifié un XNamespace objet. Donc, chaque fois qu'un XElement est créé par la fabrique de l'espace de noms seront ajoutés automatiquement. Voici le code de l'usine:
XmlDocument
, pasXDocument
.Oui, vous pouvez empêcher la XMLNS à partir de la XmlElement .
D'abord la Création de temps, il est à venir : comme le
Modifier le code : passer d'espace de noms xml
comme ce
De code C#: