Comment sérialiser un objet XML-sérialisable dans un fragment XML (pas de déclaration XML ni de références d'espace de noms dans l'élément racine)?Sérialisation dans un fragment XML - Document non-XML
Répondre
Voici un moyen hack-ish de le faire sans avoir à charger l'intégralité de la chaîne de sortie dans un XmlDocument:
using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public class Example
{
public String Name { get; set; }
static void Main()
{
Example example = new Example { Name = "Foo" };
XmlSerializer serializer = new XmlSerializer(typeof(Example));
XmlSerializerNamespaces emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
StringBuilder output = new StringBuilder();
XmlWriter writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, example, emptyNamespace);
Console.WriteLine(output.ToString());
}
}
Vous devriez être en mesure juste sérialisation comme vous le faites habituellement, puis utiliser la propriété Root
du document résultant.
Vous devrez peut-être d'abord effacer les attributs de l'élément.
+1 Cela me semble bon, mais ce que je n'ai pas expliqué dans ma question, c'est que je préfèrerais produire un flux et non un XmlDocument. – Emmanuel
Par la façon dont c'est génial. J'ai implémenté ce code pour le rendre facile à utiliser avec des fragments xml en tant que classes rapidement et ensuite vous pouvez simplement remplacer le noeud lorsque vous avez terminé. Cela rend la transition entre le code et le xml ultra-facile.
Commencez par créer des méthodes d'extension.
public static class SerializableFragmentExtensions
{
public static XElement ToElement(this ISerializableFragment iSerializableFragment)
{
var serializer = new XmlSerializer(iSerializableFragment.GetType());
var emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
var output = new StringBuilder();
var writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, iSerializableFragment, emptyNamespace);
return XElement.Parse(output.ToString(), LoadOptions.None);
}
public static T ToObject<T>(this XElement xElement)
{
var serializer = new XmlSerializer(typeof (T));
var reader = xElement.CreateReader();
var obj = (T) serializer.Deserialize(reader);
return obj;
}
}
Suivant Mettre en oeuvre la (interface marqueur - Je sais que vous n'êtes pas censé mais je pense que c'est la raison parfaite pour elle.) Interface nécessaire
public interface ISerializableFragment
{
}
Maintenant, tout ce que vous avez à faire est décorer toute classe Serializable, vous voulez convertir en un fragment XElement, avec l'interface.
[Serializable]
public class SomeSerializableClass : ISerializableFragment
{
[XmlAttribute]
public string SomeData { get; set; }
}
Enfin, testez le code.
static void Main(string[] args)
{
var someSerializableClassObj = new SomeSerializableClass() {SomeData = "Testing"};
var element = someSerializableClass.ToElement();
var backToSomeSerializableClassObj = element.ToObject<SomeSerializableClass>();
}
Merci encore pour ce code incroyablement utile.
Il y avait sur le problème que j'ai eu immédiatement en essayant cela dans mon propre projet. Avec un extrait de texte qui suivait exactement le nom correct, comme dans l'exemple que j'ai fourni, le code fonctionnait parfaitement. J'avais un nom de classe qui n'avait pas le même nom que l'élément racine. La réponse consistait simplement à ajouter XmlRootAttribute sur la classe et à l'appeler de la même manière que le nom de l'élément racine dans le fichier XML. Cela a fonctionné sans faille. Vous pouvez également être assuré que tous les éléments existants dans le document xmldocument qui ne sont pas exprimés dans la définition de classe ne rompent pas l'analyse. – jwize
- 1. Analyse d'un fragment de chaîne XML hors document en Javascript
- 2. Comment désérialiser un fragment Xml en utilisant le lecteur XML
- 3. Xml Sérialisation dans .NET
- 4. Importer un document XML
- 5. Créer un élément dans un document xml
- 6. Comment incorporer un fragment de xml dans server.xml de tomcat
- 7. Création d'un fragment de document dans YUI 2.x
- 8. Sérialisation XML avec F #
- 9. Xml Sérialisation dans une collection
- 10. document xml imbriqué dans le document Simplexml
- 11. comment ajouter un document XML à un autre document xml dans java
- 12. Insérer un élément XML à partir d'un document XML à un autre document xml
- 13. sérialisation XML en utilisant boost :: sérialisation
- 14. Sérialisation XML et LINQ
- 15. WCF sérialisation XML
- 16. VB.NET insertion de nœuds xml dans un document XML existant
- 17. sérialisation XML d'une interface
- 18. sérialisation xml conditionnelle
- 19. C# sérialisation XML
- 20. Sérialisation XML - Efficace?
- 21. Sérialisation XML et héritage
- 22. Sérialisation XML en C#
- 23. .net sérialisation xml, possible d'appliquer un formatage?
- 24. Tableau de sérialisation XML
- 25. La sérialisation XML est lente
- 26. XML sérialisation question
- 27. sérialisation XML, sans espace
- 28. Sérialisation XML C# Array
- 29. Utilisation de XPath avec un fragment HTML ou XML?
- 30. sérialisation XML requête
+1 - Je ne pense pas que ce soit vraiment hackish du tout. Peut-être plus de travail que je ne le ferais. Mais, à la fin, il dit quel format la sortie devrait être avant de faire le travail. Ce n'est pas un hack. Un hack serait de tout arracher après le fait etc. –
Je suis d'accord avec Andrew que c'est hackish. Sauf si je fais quelque chose de mal, tous mes éléments ont l'attribut 'xmlns = ""'. Aurait préféré que ce ne soit pas présent du tout. –
** aucune manipulation XmlDocument/XmlNode ** – Kiquenet