2017-04-25 1 views
1

J'ai la classe de la structure exemple suivant:Ajouter attribut fixe XmlElement sans classe wrapper

public class DataClass{ 

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

} 

Je dois ajouter un attribut fixe pour chaque champ, de sorte que la sortie ressemble à:

<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> 

Est-ce possible sans écrire une classe wrapper pour chaque Field? Quelque chose comme:

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

} 

Cordialement

Répondre

1

Non, les attributs XML ne fournissent pas de telles capacités. Une option est d'avoir DataClass mettre en œuvre IXmlSerializable. Cela vous donne un contrôle total sur le XML de sortie. Vous devez sérialiser vous-même toutes les propriétés, mais comme vous devez fournir les attributs de code pour chaque propriété, ce n'est pas si grave. Si vous avez beaucoup de DataClass es, vous pouvez envisager de créer un attribut personnalisé pour décorer les propriétés avec et déplacer la logique de sérialisation dans une classe de base ou, si une classe de base commune pour tout DataClass es est incommode, le placer dans une classe auxiliaire distincte. IXmlSerializable.WriteXml appelle alors cette logique personnalisée. Si vous contrôlez DataClass es, je pense que c'est la meilleure option.

Une alternative plus aki est de créer une enveloppe pour DataClass qui déléguerait la sérialisation du enveloppées DataClass objet à la sérialiseur XML régulière, mais remplacer une coutume XmlWriter qui ajouterait votre XML attribue aux éléments XML correspondant aux propriétés.

+0

Merci pour l'explication et les conseils. Je vais écrire mon propre sérialiseur. – Mario

1

Vous pouvez écrire un sérialiseur personnalisé plutôt que d'utiliser le construit en sérialiseur utilisant 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

Vous pouvez utiliser écrivain XML personnalisé:

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

utilisant:

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

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