Existe-t-il un moyen pour moi de sérialiser un objet dans .NET sans que les espaces de noms XML se sérialisent automatiquement également? 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 là.Comment sérialiser un objet en XML sans obtenir xmlns = "..."?
Répondre
Ahh ... peu importe. C'est toujours la recherche après que la question posée pose 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 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);
Si vous voulez vous débarrasser de la xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
et xmlns:xsd="http://www.w3.org/2001/XMLSchema"
, mais toujours garder supplémentaire votre propre espace de noms xmlns="http://schemas.YourCompany.com/YourSchema/"
, vous utiliser le même code que ci-dessus, sauf pour ce simple changement:
// Add lib namespace with empty prefix
ns.Add("", "http://schemas.YourCompany.com/YourSchema/");
Ce lien est cassé –
Si vous ne parvenez pas à vous débarrasser de xmlns supplémentaires attributs pour chaque élément, lors de la sérialisation XML de classes générées (par exemple: quand xsd.exe a été utilisé), de sorte que vous avez quelque chose comme:
<manyElementWith xmlns="urn:names:specification:schema:xsd:one" />
puis Je voudrais partager avec vous ce qui a fonctionné pour moi (un mélange de réponses précédentes et ce que je trouve here)
définir explicitement toutes 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 passer à la serialize
serializer.Serialize(writer, object, xmlns);
vous aurez les trois espaces de noms déclarés dans l'élément racine et pas plus nécessaire à générer dans 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 /> ...
Je Suggérer cette classe d'aide:
public static class Xml
{
#region Fields
private static readonly XmlWriterSettings WriterSettings = new XmlWriterSettings {OmitXmlDeclaration = true, Indent = true};
private static readonly XmlSerializerNamespaces Namespaces = new XmlSerializerNamespaces(new[] {new XmlQualifiedName("", "")});
#endregion
#region Methods
public static string Serialize(object obj)
{
if (obj == null)
{
return null;
}
return DoSerialize(obj);
}
private static string DoSerialize(object obj)
{
using (var ms = new MemoryStream())
using (var writer = XmlWriter.Create(ms, WriterSettings))
{
var serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(writer, obj, Namespaces);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
public static T Deserialize<T>(string data)
where T : class
{
if (string.IsNullOrEmpty(data))
{
return null;
}
return DoDeserialize<T>(data);
}
private static T DoDeserialize<T>(string data) where T : class
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
{
var serializer = new XmlSerializer(typeof (T));
return (T) serializer.Deserialize(ms);
}
}
#endregion
}
:)
bonne réponse :) J'ai aussi ajouter cette ligne ** stream.Position = 0; ** et renvoyé le flux entier dans ma solution .. travaillé comme prévu - tous les tags de décélération ont été supprimés – ymz
Si vous souhaitez supprimer l'espace de nom, vous pouvez également supprimer la version. Pour vous éviter de devoir effectuer une recherche, j'ai ajouté cette fonctionnalité afin que le code ci-dessous fasse les deux. Je l'ai aussi 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, donc j'ai cassé mon fichier de sortie et je l'ai sérialisé en plus petits morceaux:
public static string XmlSerialize<T>(T entity) where T : class
{
// removes version
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
using (StringWriter sw = new StringWriter())
using (XmlWriter writer = XmlWriter.Create(sw, settings))
{
// removes namespace
var xmlns = new XmlSerializerNamespaces();
xmlns.Add(string.Empty, string.Empty);
xsSubmit.Serialize(writer, entity, xmlns);
return sw.ToString(); // Your XML
}
}
- 1. Comment sérialiser un objet JavaScript générique en XML
- 2. Comment (xml) sérialiser un uri
- 3. Comment XML sérialiser un 'Type'
- 4. Comment sérialiser un objet COM dans .Net?
- 5. Comment sérialiser un objet en C# et éviter les manipulations?
- 6. Comment se débarrasser espace de noms XML par défaut si je un sérialiser un objet dans WCF en utilisant DataContact
- 7. Namesapce XML dans WPF - xmlns
- 8. Annotations XML sérialiser
- 9. Comment sérialiser un objet dans un document XDocument?
- 10. Sérialiser le dictionnaire Python en XML
- 11. Sérialiser la ligne Oracle en XML
- 12. XML Java DOM est sautillait propriétés xmlns
- 13. Comment obtenez-vous un XmlWriter pour écrire un tag HTML avec xmlns et xml: lang?
- 14. Comment faire pour GetByte à partir de l'objet sans sérialiser?
- 15. Sérialiser un DrawableGameComponent en XML en utilisant la classe ContentTypeWriter de XNA
- 16. Comment sérialiser un message électronique?
- 17. De/Sérialiser directement vers/depuis XML Linq
- 18. Sérialiser en XML et inclure le type de l'objet sérialisé
- 19. Question sur la sérialisation XML - Comment sérialiser l'élément, l'attribut et le texte d'un objet
- 20. OPENXML avec xmlns: dt
- 21. Comment sérialiser un objet dans un fichier à l'aide de NSKeyedArchiver au format NSPropertyListXMLFormat_v1_0?
- 22. Comment puis-je sérialiser correctement
- 23. Comment sérialiser?
- 24. Comment transformer un objet HTMLCollection en chaîne avec XML?
- 25. suppression xmlns dans XElement
- 26. Comment obtenir xml dans un format requis lors de la sérialisation d'un objet en utilisant la sérialisation XML dans .Net
- 27. Comment puis-je obtenir un objet TIFF libtiff à partir d'un objet MagickWand (en C)?
- 28. Comment puis-je sérialiser un objet possédant une interface en tant que propriété?
- 29. Qu'est-ce que xmlns dans ce fichier XML particulier?
- 30. Est-il possible de sérialiser un objet LINQ?
J'ai essayé en VB, les attributs xsi et xsd ont disparu, mais les attributs tels que xmlns: Q12 =, d3p1: type et xmlns: d3p1 est apparu. – MiddleKay
J'ai essayé la version C# et elle a supprimé les xsi et xsd mais ajouté un préfixe de q1: à tous les noms de balises XML, ce que je ne voulais pas.Il semble que l'exemple C# soit incomplet, référençant myXmlTextWriter qui, je suppose, doit être initialisé de la même manière que l'exemple VB. – redtetrahedron
@redtetrahedron Avez-vous trouvé un moyen de vous débarrasser de la merde 'q1'? – crush