2017-08-09 4 views
1

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 xsdetxsi attributs.

+2

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. –

+0

@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

+1

@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

Répondre

1

Ce que vous avez fait me semble correct.

Vous pouvez regarder les composants internes et voir que XmlSerializer utilise DefaultNamespaces lorsqu'aucun n'est spécifié.

Ceci est le même que si vous deviez fournir et XmlSerializerNamespaces contenant des préfixes/namespaces pour xsi et xsd et est la raison pour laquelle vous voyez des déclarations par défaut pour xsi et xsd.

La bonne chose à faire pour 'supprimer' xsd serait de fournir une instance XmlSerializerNamespaces qui ne contient pas ce préfixe/espace de noms.

0

J'ai également rencontré un problème comme vous. J'ai d'abord utilisé linq mais cela n'a pas fonctionné. Plus tard, j'ai trouvé un meilleur outil XSLT. Vous pouvez utiliser XSLT comme Online.