2009-09-21 9 views
7

Ich habe ein XML-Dokument:Wie ändere ich den Namen des Stammelements, während ich den Inhalt mit XmlSerializer behalte?

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

Ich muß ein Objekt deserialisieren, die mit allem, was sonst noch das gleiche zu einem anderen Root-Namen serialisiert.

Zum Beispiel:

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

Wenn die Serialisierung, können wir immer XmlRootAttribute gelten für einen anderen Stammnamen zur Serialisierung, aber ich bin nicht sicher, wie zu einem anderen XmlRootAttribute deserialisieren. Es bleibt error in document (1,2) Fehler auf das Root-Attribut zeigen.

Wie kann ich das erreichen?

Antwort

9

XmlRootAttribute sollte

[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 arbeiten: die XML-

4

Haben Sie versucht, die Klasse XmlAttributeOverrides zu verwenden?

+1

Sie müssen alle diese Leckereien lieben, die Sie im Rahmen finden, indem Sie diese Seite surfen. –

4

ein Beispiel für die Verwendung von XmlAttributeOverrides. Wenn Sie sich ein, um hjb417 auch

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

Danke Mathew, aber meine Herausforderung ist es, zu dataNew Objekt zu deserialisieren. Also, in Ihrem Code wird die XML-Datei identisch sein, aber die Serialisierungslogik muss etwas wie unter var xSer2 = neue XmlSerializer (typeof (dataNew)); var obj2 = xSer2.Deserialize (fs1); – G33kKahuna

+0

Mathew, irgendwelche Ideen ... danke – G33kKahuna

+0

In diesem Fall würden Sie das XmlRootAttribute ("dataNew") durch "data" ersetzen und der typeof (data) wäre typeof (dataNew) –

7

Abstimmung geben, wenn es nur der Root-Name ist Sie ändern möchten, können Sie das Root-Attribut angeben, wenn die XmlSerializer deklarieren.

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

Sie können ExtendedXmlSerializer verwenden. Diese Serializer-Unterstützung ändert den Namen des Stammelements und den Namen der Eigenschaft. Wenn Sie Klasse wie dieses:

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

Sie können es serialisiert:

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

Ihre xml wird wie folgt aussehen:

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

ExtendedXmlSerializer viele andere nützliche Funktionen hat:

  • Deserializatio n xml von Standard XMLSerializer
  • Serialisierung Klasse mit Eigentum Schnittstelle
  • Serialisierung zirkuläre Referenz und Referenz-ID
  • Deserialisierung der alten Version von xml
  • Property Verschlüsselung
  • Individuelle Serializer

ExtendedXmlSerializer unterstützt. net 4.5 und .net Core. Sie können es mit WebApi und AspCore integrieren.

Verwandte Themen