2009-09-21 14 views
7

que tienen un documento XML:¿Cómo cambio el nombre del elemento raíz mientras mantengo los contenidos usando XmlSerializer?

<data> 
    <elmt1>Element 1</elmt1> 
    <elmnt2>Element 2</elmnt2> 
    <elmnt3>Element 3</elmnt3> 
</data> 

necesito deserializar a un objeto que serializa a un nombre de raíz diferente con todo lo demás se mantiene igual.

Por ejemplo:

<dataNew> 
    <elmt1>Element 1</elmt1> 
    <elmnt2>Element 2</elmnt2> 
    <elmnt3>Element 3</elmnt3> 
</dataNew> 

Cuando seria, siempre podemos aplicar XmlRootAttribute para serializar a un nombre de raíz diferente pero no estoy seguro de cómo deserializar a otro XmlRootAttribute. Sigue fallando error in document (1,2) apuntando al atributo raíz.

¿Cómo puedo lograr eso?

Respuesta

9

XmlRootAttribute se supone que funciona

[XmlRoot("dataNew")] 
public class MyData() 
{ 
    [XmlElement("elmt1")] 
    public string myElement1{get;set;} 

    [XmlElement("elmnt2")] 
    public string myElement2{get;set;} 

    [XmlElement("elmtn3")] 
    public string myElement3{get;set;} 

} 

EDIT: Completado el XML

4

¿Intentó utilizar la clase XmlAttributeOverrides?

+1

Tienes que amar todas estas golosinas que encuentras en el marco navegando por este sitio. –

4

una muestra del uso de XmlAttributeOverrides. Si vota por uno da a hjb417 así

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var fs = File.OpenRead("XmlFile1.xml")) 
     using (var fs2 = File.OpenRead("XmlFile2.xml")) 
     { 
      var xSer = new XmlSerializer(typeof(data)); 
      var obj = xSer.Deserialize(fs); 
     // 
      var xattribs = new XmlAttributes(); 
      var xroot = new XmlRootAttribute("dataNew"); 
      xattribs.XmlRoot = xroot; 
      var xoverrides = new XmlAttributeOverrides(); 
      xoverrides.Add(typeof(data), xattribs); 
      var xSer2 = new XmlSerializer(typeof(data), xoverrides); 
      var obj2 = xSer2.Deserialize(fs2); 
     } 
    } 
} 

public class data 
{ 
    public string elmt1 { get; set; } 
    public string elmnt2 { get; set; } 
    public string elmnt3 { get; set; } 
} 
+0

Gracias a Mateo, pero mi desafío es deserializar a datosNuevo objeto. Entonces, en su código, el archivo XML será el mismo, pero la lógica de serialización necesita realizar algo como por debajo de var xSer2 = new XmlSerializer (typeof (dataNew)); var obj2 = xSer2.Deserialize (fs1); – G33kKahuna

+0

Mathew, cualquier idea ... gracias – G33kKahuna

+0

En ese caso reemplazaría XmlRootAttribute ("dataNew") por "data" y el typeof (data) sería typeof (dataNew) –

7

Si es sólo el nombre de la raíz que quiere cambiar, se puede especificar el atributo de la raíz cuando se declara XmlSerializer.

XmlSerializer xmlSerializer = new XmlSerializer(typeof(data), new XmlRootAttribute("dataNew")); 
0

Puede usar ExtendedXmlSerializer. Este soporte de serializador cambia el nombre del elemento raíz y el nombre de la propiedad. Si tiene clase como esta:

[XmlRoot("dataNew")] 
public class Data 
{ 
    [XmlElement("elmt1")] 
    public string Element1 { get; set; } 

    [XmlElement("elmnt2")] 
    public string Element2 { get; set; } 

    [XmlElement("elmtn3")] 
    public string Element3 { get; set; } 
} 

Usted puede serializar:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(); 
var obj = new Data 
    { 
     Element1 = "A", 
     Element2 = "B", 
     Element3 = "C", 
    }; 
var xml = serializer.Serialize(obj); 

el código XML se verá así:

<?xml version="1.0" encoding="utf-8"?> 
<dataNew type="Models.Example"> 
    <elmt1>A</elmt1> 
    <elmnt2>B</elmnt2> 
    <elmtn3>C</elmtn3> 
</dataNew> 

ExtendedXmlSerializer tiene muchas otras características útiles:

  • Deserializatio n xml de la clase serialización estándar XMLSerializer
  • con interfaz propiedad
  • serialización referencia circular y referencia Id
  • Deserialización de versión antigua de XML
  • cifrado Propiedad
  • serializador personalizado

ExtendedXmlSerializer apoya. net 4.5 y .net Core. Puede integrarlo con WebApi y AspCore.

Cuestiones relacionadas