2010-11-11 18 views
7

Tengo un objeto personalizado que tiene una propiedad de cadena llamada 'Nombre' Me gustaría mantener igual el XML generado por serialización, pero agregue un atributo al elemento llamado 'NiceName' con un valor de 'Nombre completo'.Agregar atributo Xml a la propiedad de cadena

Esto es lo que tengo actualmente:

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

Esto es lo que me gustaría para generar:

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

solo me falta esto por algún XSLT, así que no quiero cambiar el De manera que la clase funciona si es posible. ES DECIR. Cambiar el nombre de una cadena a una clase personalizada. Todos los objetos tendrán el mismo atributo que nunca cambiará, será totalmente de solo lectura.

Respuesta

4

Es posible si se define otro tipo de la siguiente manera:

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

Usando

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

generará

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

Gracias por las respuestas, sin embargo lo que estoy tratando de hacer es una alternativa de código para el nombre del nodo no el nombre de las personas. Sé que es mejor escribir esto en el xslt, solo quiero administrarlo desde .net en lugar de xslt. Lo que quiero decir es que necesito generar algo así como Mr Joe Blogs En mi Xslt, solo mostraría el nicentro de cada elemento y el valor para producir una interfaz de usuario mucho más agradable. como "Nombre completo = Mr Joe Blogs" en lugar de "FullName = Joe Blogs" o una alternativa es 1234 Jammy

+0

No puedo averiguar cómo aplicar una propiedad de nivel hermano a otra propiedad como una atributo. Creo que la respuesta de Aliostad "parece" un poco desordenada, pero creo que es el camino a seguir. – hunter

+0

Será mejor que lo haga en xslt, srsly. 'XmlSerializer' no puede manejar este tipo de contorsionismo. –

7

Se puede utilizar una combinación de XmlAttribute y xmltext()

tomar a continuación ejemplo de declaración de la clase:

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 salida será

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

Cuestiones relacionadas