2017-04-25 5 views
1

I Klasse der folgenden Beispielstruktur:hinzufügen festes Attribut XmlElement ohne Wrapper-Klasse

public class DataClass{ 

    public String Field1{ get; set; } 
    public Int32 Field2{ get; set; } 
    public Int32 Field3{ get; set; } 

} 

Ich habe ein festes Attribut für jedes Feld hinzuzufügen, so dass die Ausgabe wie folgt aussieht:

<DataClass> 
    <Field1 code="code#1">Value of Field1</Field1> 
    <Field2 code="code#2">Value of Field2</Field2> 
    <Field3 code="code#3">Value of Field3</Field3> 
</DataClass> 

Ist dies möglich, ohne eine Wrapper-Klasse für jedes Feld zu schreiben? Etwas wie:

public class DataClass{ 

    [XmlElement(FixedAttribute="code#1")] 
    public String Field1{ get; set; } 

    [XmlElement(FixedAttribute="code#2")] 
    public Int32 Field2{ get; set; } 

    [XmlElement(FixedAttribute="code#3")] 
    public Int32 Field3{ get; set; } 

} 

Mit freundlichen Grüßen

Antwort

1

Nein, XML-Attribute bieten keine solche Fähigkeiten. Eine Option ist DataClass zu implementieren IXmlSerializable. Dies gibt Ihnen die volle Kontrolle über die Ausgabe-XML. Sie müssen alle Eigenschaften selbst serialisieren, aber da Sie die Code-Attribute für jede Eigenschaft sowieso angeben müssen, ist es nicht so schlimm. Wenn Sie eine Menge von DataClass es haben, können Sie ein benutzerdefiniertes Attribut erstellen, um Eigenschaften mit einer Serialisierungslogik zu dekorieren und in eine Basisklasse zu verschieben, oder, wenn eine gemeinsame Basisklasse für alle DataClass unpraktisch ist, in eine separate Hilfsklasse zu legen. IXmlSerializable.WriteXml würde dann diese benutzerdefinierte Logik aufrufen. Wenn Sie DataClass es steuern, denke ich, dass dies die bessere Option ist.

Eine Hacky Alternative ist ein Wrapper für DataClass zu erstellen, die die Serialisierung des umwickelten DataClass Objekts in dem regulären XML Serializer delegieren würden, aber ersetzen Sie ein benutzerdefinierte XmlWriter, dass Ihre XML-Attribute zu den XML-Elementen entsprechend Eigenschaften hinzufügen würde.

+0

Danke für die Erklärung und die Hinweise. Ich werde meinen eigenen Serialisierer schreiben. – Mario

1

Sie einen benutzerdefinierten Serializer schreiben kann, anstatt die in Serializer verwenden errichtet unter Verwendung von XML Linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication49 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      XElement dataClass = new XElement("DataClass"); 

      for(int i = 1; i <= 3; i++) 
      { 
       XElement field = new XElement("Field" + i.ToString(), new object[] { 
        new XAttribute("code", "code#" + i.ToString()), 
        "Value of Field" + i.ToString() 
       }); 
       dataClass.Add(field); 
      } 

     } 
    } 
} 
0

können Sie benutzerdefinierte XML-Writer verwenden:

public class DataClassWriter : XmlTextWriter 
{ 
    public DataClassWriter(string url) : base(url, Encoding.UTF8) { } 

    public override void WriteStartElement(string prefix, string localName, string ns) 
    { 
     if (localName.StartsWith("Field")) 
     { 
      base.WriteStartElement(prefix, localName, ns); 
      base.WriteAttributeString("code", "code#" + localName.Substring(5)); 
     } 
     else 
      base.WriteStartElement(prefix, localName, ns); 
    } 
} 

Verwendung:

var xs = new XmlSerializer(typeof(DataClass)); 

using (var writer = new DataClassWriter("out.xml")) 
    xs.Serialize(writer, data); 
Verwandte Themen