J'utilise le .Net XmlSerializer
pour sérialiser un objet dans un document XML, dans une application C# Windows Forms.Comment supprimer l'attribut xmlns: xsd mais conserver xmlns: xsi
L'élément racine doit finir par ressembler à:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:///C:/data//MySchema.xsd">
<!-- ... -->
</root>
Dans une classe partielle (à se joindre à la classe partielle créée par xsd.exe
), j'ai ajouté la propriété suivante pour ajouter l'attribut xsi:noNamespaceSchemaLocation
.
[XmlAttribute("noNamespaceSchemaLocation", Namespace = XmlSchema.InstanceNamespace)]
public string xsiNoNamespaceSchemaLocation = @"file:///C://data//MySchema.xsd";
Et pour enlever tous les autres espaces de noms, mais garder le xsi
que je l'ai utilisé:
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Et puis passé ns
à la méthode XmlSerializer.Serialize()
.
Cela fonctionne jusqu'à maintenant, mais je ne suis pas sûr que ce soit correct. J'ai l'impression d'enlever ce qu'il y a par défaut, seulement pour essayer d'en rajouter un morceau ... ça a l'air d'une odeur de code.
Peut-être y at-il une meilleure façon de supprimer uniquement le xsd
mais en laissant la valeur par défaut xsi
, je n'ai donc pas besoin de la rajouter à nouveau?
Note: Il y a une question sans réponse à ce déjà depuis quelque temps here, la seule réponse proposée ne convient pas car il élimine les xsd
etxsi
attributs.
Ce que vous avez fait me semble correct. Vous pouvez regarder les internes et voir que 'XmlSerializer' utilise [' DefaultNamespaces'] (http://referencesource.microsoft.com/#System.Xml/System/Xml/Serialization/XmlSerializer.cs,34e80c7c306a0313) quand aucun n'est spécifié . C'est pourquoi vous voyez 'xsi' et' xsd' par défaut. –
@CharlesMager Merci, en regardant cela, j'ai réalisé que je pouvais ajuster l'ajout de l'espace de noms à: 'ns.Add (" xsi ", XmlSchema.InstanceNamespace);' – Toby
@CharlesMager ayant lu que plus il semble que votre commentaire est sur place FWIW , si vous voulez en faire une réponse, je l'accepterai. – Toby