Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Add Xml Attribute to string property

I have a custom object which has a string property called 'Name' I'd like to keep the XML generated by serialization the same but add an attribute to the element called 'NiceName' with a value of 'Full name'.

This is what i have currently:

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

This is what i would like to generate:

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

I only need this for some XSLT so i don't want to change the way the class works if possible. I.E. Changing name from string to a custom class. All objects will have the same attribute it will never change it is going to be totally read only.

like image 553
Jammy Avatar asked Nov 11 '10 12:11

Jammy


2 Answers

You can use a combination of XMLAttribute and XmlText()

take below example of class declaration:

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

The output will be

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

like image 139
jaxxbo Avatar answered Sep 28 '22 11:09

jaxxbo


It is possible if you define another type as below:

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

Using

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

Will generate

<?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>
like image 21
Aliostad Avatar answered Sep 28 '22 12:09

Aliostad