Ahh ... tant pis. C'est toujours la recherche après que la question est posée qui donne la réponse. Mon objet qui est sérialisé est obj
et a déjà été défini. L'ajout d'un XMLSerializerNamespace avec un seul espace de noms vide à la collection fait l'affaire.
Dans 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);
q1
merde?Si vous voulez vous débarrasser du supplément
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
etxmlns:xsd="http://www.w3.org/2001/XMLSchema"
, tout en conservant votre propre espace de nomsxmlns="http://schemas.YourCompany.com/YourSchema/"
, vous utilisez le même code que ci-dessus, sauf pour ce simple changement:la source
Si vous souhaitez supprimer l'espace de noms, vous pouvez également supprimer la version, pour vous éviter de rechercher, j'ai ajouté cette fonctionnalité afin que le code ci-dessous fasse les deux.
Je l'ai également enveloppé dans une méthode générique car je crée de très gros fichiers xml qui sont trop volumineux pour être sérialisés en mémoire, j'ai donc décomposé mon fichier de sortie et le sérialiser en plus petits «morceaux»:
la source
StringWriter
codage UTF-16 par défaut peut entraîner des problèmes de désérialisation en aval.using (var reader = XmlReader.Create(stream)){ reader.Read(); }
Cela lève une exception car la déclaration indique qu'il s'agit de UTF-16 alors que le contenu était en fait écrit en UTF-8.System.Xml.XmlException: 'There is no Unicode byte order mark. Cannot switch to Unicode.'
XmlReader
, vous pouvez utiliservar streamReader = new StreamReader(stream, System.Text.Encoding.UTF8, true);
La valeur true utilisera la nomenclature si elle est trouvée, sinon la valeur par défaut que vous fournissez.Je suggère cette classe d'assistance:
:)
la source
new XmlSerializerNamespaces(new[] {XmlQualifiedName.Empty})
au lieu denew XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")})
est un moyen intentionnellement plus clair de le coder.Si vous ne parvenez pas à vous débarrasser des attributs xmlns supplémentaires pour chaque élément, lors de la sérialisation vers xml à partir des classes générées (par exemple: lorsque xsd.exe a été utilisé), vous avez donc quelque chose comme:
puis je partagerais avec vous ce qui a fonctionné pour moi (un mélange de réponses précédentes et ce que j'ai trouvé ici )
définissez explicitement tous vos différents xmlns comme suit:
puis passez-le à la sérialisation
vous aurez les trois espaces de noms déclarés dans l'élément racine et il ne sera plus nécessaire de les générer dans les autres éléments qui seront préfixés en conséquence
la source
la source