2010-11-11 4 views
7

J'ai un objet personnalisé qui a une propriété de chaîne appelée 'Nom' Je voudrais garder le XML généré par sérialisation le même mais ajouter un attribut à l'élément appelé 'NiceName' avec une valeur de 'Nom complet'.Ajouter Xml Attribut à la propriété de chaîne

C'est ce que j'ai actuellement:

<TheObject> 
    <Name>mr nobody</Name> 
</TheObject> 

C'est ce que je voudrais générer:

<TheObject> 
    <Name NiceName='Full name'>mr nobody</Name> 
</TheObject> 

Je ne ai besoin depuis un certain XSLT donc je ne veux pas changer la façon dont la classe fonctionne si possible. C'EST À DIRE. Changer le nom de la chaîne en une classe personnalisée. Tous les objets auront le même attribut, il ne changera jamais, il sera totalement en lecture seule.

Répondre

4

Il est possible que si vous définissez un autre type comme ci-dessous:

public class Person 
{ 

    private string _name; 


    [XmlIgnore] 
    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name = value; 
      ThePersonName = new PersonName() 
           { 
            Name = FullName, 
            NiceName = _name 
           }; 
     } 
    } 

    [XmlElement(ElementName = "Name")] 
    public PersonName ThePersonName { get; set; } 

    public string FullName { get; set; } 

} 

public class PersonName 
{ 
    [XmlAttribute] 
    public string NiceName { get; set; } 

    [XmlText] 
    public string Name { get; set; } 
} 

En utilisant

 XmlSerializer s = new XmlSerializer(typeof(Person)); 
     Person ali = new Person(); 
     ali.FullName = "Ali Kheyrollahi"; 
     ali.Name = "Nobody"; 
     s.Serialize(new FileStream("ali.xml",FileMode.Create), ali); 

générerons

<?xml version="1.0"?> 
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Name NiceName="Nobody">Ali Kheyrollahi</Name> 
    <FullName>Ali Kheyrollahi</FullName> 
</Person> 
+0

Merci pour les réponses mais ce que je suis en train de faire est le code une alternative pour le nom de noeud ne le nom des personnes. Je sais que c'est probablement mieux d'écrire ceci dans le xslt c'est juste que je veux le gérer à partir de .net plutôt que le xslt. Ce que je veux dire, c'est que j'ai besoin de générer quelque chose comme Mr Joe Blogs Dans mon Xslt je voudrais juste sortir le nom de famille pour chaque élément et la valeur pour produire une interface utilisateur beaucoup plus agréable. comme "Full Name = Mr Joe Blogs" au lieu de "FullName = Joe Blogs" ou une alternative est 1234 Jammy

+0

Je ne peux pas comprendre comment appliquer une propriété de niveau frère à une autre propriété en tant que attribut. Je pense que la réponse d'Aliostad "semble" un peu brouillon mais je pense que c'est la voie à suivre. – hunter

+0

Vous feriez mieux de le faire dans xslt, srsly. 'XmlSerializer' ne peut pas gérer ce genre de contorsion. –

7

Vous pouvez utiliser une combinaison de xmlAttribut et XmlText()

prendre exemple ci-dessous la déclaration de classe:

public class Description { 
    private int attribute_id; 
    private string element_text; 

    [XmlAttribute("id")] 
    public int Id { 
     get { return attribute_id; } 
     set { attribute_id = value; } 
    } 

    [XmlText()] 
    public string Text { 
     get { return element_text; } 
     set { element_text = value; } 
    } 
} 

La sortie sera

<XmlDocRoot> 
<Description id="1">text</Description> 

Questions connexes