¿Cómo serializo un objeto serializable en XML a un fragmento XML (sin declaración XML ni referencias de espacio de nombres en el elemento raíz)?Serializar en un fragmento XML - no Documento XML
Respuesta
Aquí es una manera hack-ish de hacerlo sin tener que cargar toda la cadena de salida en 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());
}
}
Usted debe ser capaz de serializar al igual que lo hace normalmente, y luego utilizar la propiedad Root
del documento resultante.
Es posible que primero tenga que borrar los atributos del elemento.
+1 Me parece bien, pero lo que no explique en mi pregunta es que preferiría producir un flujo y no un XmlDocument. – Emmanuel
Por cierto esto es impresionante. Implementé este código para facilitar el trabajo con fragmentos xml como clases rápidamente y luego puedes simplemente reemplazar el nodo cuando haya terminado. Esto hace que la transición entre el código y xml sea muy fácil.
Primero cree algunos métodos de extensión.
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;
}
}
Siguiente implementar la interfaz requerida (interfaz de marcador - Te conozco se supone que no, pero creo que esta es la razón perfecta para él.)
public interface ISerializableFragment
{
}
Ahora todo lo que tiene que hacer es decorar cualquier clase de Serializable, desea convertir a un XElement Fragment, con la interfaz.
[Serializable]
public class SomeSerializableClass : ISerializableFragment
{
[XmlAttribute]
public string SomeData { get; set; }
}
Finalmente, pruebe el código.
static void Main(string[] args)
{
var someSerializableClassObj = new SomeSerializableClass() {SomeData = "Testing"};
var element = someSerializableClass.ToElement();
var backToSomeSerializableClassObj = element.ToObject<SomeSerializableClass>();
}
Gracias de nuevo por este código increíblemente útil.
Hubo un problema que tuve inmediatamente al intentar esto en mi propio proyecto. Con un fragmento de texto que siguió exactamente al nombre correcto, como en el ejemplo que proporcioné, el código funcionó a la perfección. Tenía un nombre de clase que no tenía el mismo nombre que el elemento raíz. La respuesta fue simplemente agregar XmlRootAttribute en la clase y darle el mismo nombre que el nombre del elemento raíz en el xml. Esto funcionó sin defectos. También puede estar seguro de que cualquier elemento que exista en el documento xml que no esté expresado en la definición de clase no interrumpirá el análisis sintáctico. – jwize
- 1. Cómo XML Serializar un 'Tipo'
- 2. XML IDREF ¿otro documento XML?
- 3. Cómo XML-serializar un diccionario
- 4. XML Serializar objeto dinámico
- 5. serializar clase a XML?
- 6. ¿Agregar un documento xml a un nodo xml en C#?
- 7. lxml ¿Crear fragmento XML sin elemento raíz?
- 8. Serializar un System.Array a una Cadena XML
- 9. ¿Serializar un objeto a JSON, XML, YAML?
- 10. Incrustar un documento xml dentro de una cadena xml
- 11. C# serializar decimal a xml
- 12. Convirtiendo un documento XML a un diccionario
- 13. Cómo serializar este XML en .NET (matriz)
- 14. Plugin jQuery para serializar XML en JSON
- 15. Objeto PHP como documento XML
- 16. Usando XPath para analizar un documento XML
- 17. ¿Cómo crear un documento XML utilizando XmlDocument?
- 18. Crear documento XML utilizando nodeList
- 19. Convertir fragmento String XML en Document Node en Java
- 20. Serializar la fila de Oracle a XML
- 21. Deserializar matriz XML en el documento raíz
- 22. Serializar a XML usando boost :: serialization
- 23. Error en el documento XML (2,2)
- 24. Documento XML de análisis en C#
- 25. XML: para adjuntar documento xml en el nodo de otro documento
- 26. Generar documento XML en memoria con JavaScript
- 27. quitar declaración XML del documento XML generado usando java
- 28. ¿Cómo serializar objetos anónimos a XML?
- 29. ¿Puedo serializar tipos anónimos como xml?
- 30. error Deserialización en el documento XML (1,1)
+1 - No creo que sea realmente hackish en absoluto. Tal vez más trabajo de configuración de lo que me gustaría hacer. Pero, al final, le dice qué formato debe tener la salida antes de que haga el trabajo. Eso no es un truco. Un truco sería quitar todo después del hecho, etc. –
Estoy de acuerdo con Andrew en que esto es un hack. A menos que esté haciendo algo mal, todos mis elementos tienen el atributo 'xmlns =' '' '. Hubiera preferido que esto no estuviera presente en absoluto. –
** no manipulaciones XmlDocument/XmlNode ** – Kiquenet