119 votes

Comment sérialiser un objet en XML sans obtenir xmlns = "..."?

Est-il possible pour moi de sérialiser un objet dans .NET sans la sérialisation automatique des espaces-noms XML? Il semble que par défaut, .NET pense que les espaces de noms XSI et XSD devraient être inclus, mais je ne les veux pas.

159voto

Wes P Points 3153

Ahh… tant pis. C'est toujours la recherche après la question qui donne la réponse. Mon objet en cours de sérialisation est obj et a déjà été défini. L'ajout d'un XMLSerializerNamespace avec un seul espace de nom vide à la collection fait l'affaire.

En VB comme ceci:

 Dim xs As New XmlSerializer(GetType(cEmploymentDetail))
Dim ns As New XmlSerializerNamespaces()
ns.Add("", "")

Dim settings As New XmlWriterSettings()
settings.OmitXmlDeclaration = True

Using ms As New MemoryStream(), _
    sw As XmlWriter = XmlWriter.Create(ms, settings), _
    sr As New StreamReader(ms)
xs.Serialize(sw, obj, ns)
ms.Position = 0
Console.WriteLine(sr.ReadToEnd())
End Using
 

en C # comme ceci:

 //Create our own namespaces for the output
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();

//Add an empty namespace and empty value
ns.Add("", "");

//Create the serializer
XmlSerializer slz = new XmlSerializer(someType);

//Serialize the object with our own namespaces (notice the overload)
slz.Serialize(myXmlTextWriter, someObject, ns);
 

21voto

Ali B Points 81

Si vous souhaitez vous débarrasser des%% xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" et xmlns:xsd="http://www.w3.org/2001/XMLSchema" supplémentaires, tout en conservant votre propre espace-noms xmlns="http://schemas.YourCompany.com/YourSchema/" , vous utilisez le même code que ci-dessus, à l'exception changement:

 //  Add lib namespace with empty prefix  
ns.Add("", "http://schemas.YourCompany.com/YourSchema/");   
 

Vous pouvez trouver plus de conseils et astuces de sérialisation XML ici .

6voto

vinjenzo Points 11

Si vous êtes incapable de se débarrasser des extra xmlns attributs pour chaque élément, lors de la sérialisation en xml de classes générées (par exemple: lors de la xsd.exe a été utilisé), si vous avez quelque chose comme:

<manyElementWith xmlns="urn:names:specification:schema:xsd:one" />

ensuite, je voudrais partager avec vous ce qui a fonctionné pour moi (un mélange de réponses et ce que j'ai trouvé ici)

définir explicitement tous vos différentes xmlns comme suit:

Dim xmlns = New XmlSerializerNamespaces()
xmlns.Add("one", "urn:names:specification:schema:xsd:one")
xmlns.Add("two",  "urn:names:specification:schema:xsd:two")
xmlns.Add("three",  "urn:names:specification:schema:xsd:three")

puis la passer à la sérialiser

serializer.Serialize(writer, object, xmlns);

vous aurez les trois espaces de noms déclarés dans l'élément racine et pas plus besoin d'être générés par les autres éléments qui seront préfixés en conséquence

<root xmlns:one="urn:names:specification:schema:xsd:one" ... />
   <one:Element />
   <two:ElementFromAnotherNameSpace /> ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X