2017-01-19 4 views
3

Lassen Sie uns sagen, dass ich den folgenden Code haben, und in den XML unter dem Code serialisiert werden soll:Pass String-Variable auf XmlAttribute von XMLSerializer

class Human 
{ 
    [XmlElement("OwnedObjects")] 
    public List<WorldObjects> ownedObjects; 
} 

class WorldObjects 
{ 
    [XmlIgnore] 
    public string type; 
    [XmlAttribute(type)] 
    public string name; 

    public WorldObjects(string _type, string _name) 
    { 
     type = _type; 
     name = _name; 
    } 
} 

Human bob = new Human; 
bob.ownedObjects = new List<WorldObjects>; 
bob.ownedObjects.Add(new WorldObjects(drink, tea)); 

// Serialize 

XML:

<Human> 
    <OwnedObjects drink="tea" /> 
</Human> 

Die Linie [XmlAttribute(type)] führt in einem Fehler.

Gibt es trotzdem eine Änderung des Attributnamens durch Übergabe einer String-Variablen?

Vielen Dank im Voraus.

EDIT: Ich muss entschuldigen, dass ich eine so einfache Lösung übersehen. Danke für deine Antworten. Danke auch Ben und dbc für eine Verbesserung des Designs.

+3

Warum wollen Sie nicht wie die Ausgabe haben: Diese Deserialisierung viel einfacher – Ben

+0

müssen Sie 'machen würde setzen Tippen Sie 'in doppelte Anführungszeichen, wie Sie es für das' XMLElement' getan haben. –

Antwort

3

Sie können [XmlAnyAttribute] für diesen Zweck verwenden. gibt an, dass das Member (ein Feld, das ein Array von XmlAttribute-Objekten zurückgibt) beliebige XML-Attribute enthalten kann. Beachten Sie, dass eine Eigenschaft kann auch als ein Feld verwendet werden, um ein einzelnes Attribut mit dem gewünschten Namen und Wert zu konstruieren und zurück:

public class WorldObjects 
{ 
    [XmlAnyAttribute] 
    public XmlAttribute [] Attributes 
    { 
     get 
     { 
      var attr = new XmlDocument().CreateAttribute(XmlConvert.EncodeLocalName(type)); 
      attr.Value = name; 
      return new[] { attr }; 
     } 
     set 
     { 
      var attr = (value == null ? null : value.SingleOrDefault()); 
      if (attr == null) 
       name = type = string.Empty; 
      else 
      { 
       type = XmlConvert.DecodeName(attr.Name); 
       name = attr.Value; 
      } 
     } 
    } 

    [XmlIgnore] 
    public string name; 

    [XmlIgnore] 
    public string type; 

    // XmlSerializer required parameterless constructor 
    public WorldObjects() : this(string.Empty, string.Empty) { } 

    public WorldObjects(string _type, string _name) 
    { 
     type = _type; 
     name = _name; 
    } 
} 

XmlConvert.EncodeLocalName() ist dann erforderlich, wenn die Zeichenfolge type keine valid XML name ist. Ein gültiger XML-Name muss z. B. mit einem Buchstaben und nicht mit einer Zahl beginnen.

Beispiel fiddle.

Durch die Verwendung von festen Attributen wie type="drink" name="tea" kann es jedoch einfacher sein, bei Bedarf ein XML-Schema zu erstellen, damit Sie Ihr Design überdenken können. [XmlAnyAttribute] entspricht dem Schemaelement xsd:anyAttribute, das die Anzeige beliebig vieler Attribute eines beliebigen Namens ermöglicht. Sie möchten angeben, dass für Ihr Element <OwnedObjects> genau ein Attribut eines beliebigen Namens vorhanden sein muss.

Verwandte Themen