Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

.net class xml attribute to create multiple namespaces

I want to have a class property when serializing it to have multiple namespaces in the output. The XmlElementAttribute isn't working for me. Can anyone help?

My code:

XML Output:

<MyClass>
    <Property1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
    <Property2/>
</MyClass>

Class:

public class MyClass
{
    [XmlElementAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
    public string Property1 { get; set; }

    public string Property1 { get; set; }
}
like image 591
sysboard Avatar asked Nov 28 '25 23:11

sysboard


1 Answers

The serializer can defines prefixes (like in your example) but you only have one namespace per element. Use XmlElementAttribute (aka XmlElement) for the single relevant namespace and define prefixes when you serialize.

To get this:

<?xml version="1.0" encoding="utf-16"?>
<OrderedItem xmlns:inventory="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
    <inventory:ItemName>Widget</inventory:ItemName>
    <inventory:Description>Regular Widget</inventory:Description>
    <money:UnitPrice>2.3</money:UnitPrice>
    <inventory:Quantity>10</inventory:Quantity>
    <money:LineTotal>23</money:LineTotal>
</OrderedItem>

You have:

public class OrderedItem
{
    [XmlElementAttribute(Namespace = "http://www.cpandl.com")]
    public string ItemName { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cpandl.com")]
    public string Description { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cohowinery.com")]
    public decimal UnitPrice { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cpandl.com")]
    public int Quantity { get; set; }
    [XmlElementAttribute(Namespace = "http://www.cohowinery.com")]
    public int LineTotal { get; set; }
}

And serialize with prefixes set in your XmlSerializerNamespaces:

OrderedItem example = new OrderedItem
            {
                ItemName = "Widget",
                Description = "Regular Widget",
                UnitPrice = (decimal) 2.3,
                Quantity = 10,
                LineTotal = 23
            };

XmlSerializer serializerX = new XmlSerializer(example.GetType());
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add("inventory", "http://www.cpandl.com");
namespaces.Add("money", "http://www.cohowinery.com");
serializerX.Serialize(Console.Out, example, namespaces);
like image 180
KCD Avatar answered Dec 01 '25 14:12

KCD



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!