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.
Réponses
Trop de publicités? 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);
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 .
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 /> ...