2009-09-21 7 views
7

Ho un documento XML:Come posso cambiare il nome dell'elemento root mentre si mantiene il contenuto usando XmlSerializer?

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

ho bisogno di deserializzare a un oggetto che serializza a un nome diverso radice con tutto il resto rimanendo lo stesso.

Ad esempio:

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

durante la serializzazione, possiamo applicare sempre XmlRootAttribute per serializzare a un nome radice diverso, ma io non sono sicuro di come deserializzare a un diverso XmlRootAttribute. Continua a non riuscire error in document (1,2) puntando all'attributo root.

Come posso ottenere quello?

risposta

9

XmlRootAttribute doveva lavorare

[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: Completata la XML

4

Hai provato a utilizzare la classe XmlAttributeOverrides?

+1

Devi semplicemente amare tutte queste chicche che trovi nel framework navigando su questo sito. –

4

un esempio di utilizzo di XmlAttributeOverrides. Se si vota fino a dare uno hjb417 così

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

Grazie Mathew, ma la mia sfida è deserializzare nell'oggetto dataNew. Quindi, nel tuo codice il file XML sarà lo stesso, ma la logica di serializzazione deve eseguire qualcosa di simile a var xSer2 = new XmlSerializer (typeof (dataNew)); var obj2 = xSer2.Deserialize (fs1); – G33kKahuna

+0

Mathew, qualsiasi idea ... grazie – G33kKahuna

+0

In tal caso sostituiresti XmlRootAttribute ("dataNew") con "data" e il tipoof (dati) sarebbe typeof (dataNew) –

7

Se è solo il nome di root che si desidera modificare è possibile specificare l'attributo principale quando si dichiara il XmlSerializer.

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

È possibile utilizzare ExtendedXmlSerializer. Questo serializzatore supporta il cambiamento del nome dell'elemento radice e del nome della proprietà. Se si dispone di classe come questa:

[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; } 
} 

è possibile serializzare esso:

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

tuo XML sarà simile:

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

ExtendedXmlSerializer ha molte altre caratteristiche utili:

  • Deserializatio n XML da XMLSerializer
  • classe serializzazione di serie con interfaccia proprietà
  • serializzazione riferimento circolare e riferimento Id
  • deserializzazione di vecchia versione di XML
  • crittografia Proprietà
  • serializzatore personalizzato

ExtendedXmlSerializer supporta. net 4.5 e .net Core. Puoi integrarlo con WebApi e AspCore.

Problemi correlati