Jan Jongboom
Jan Jongboom

Reputation: 27342

Use XmlSerializer to add a namespace without a prefix

I want my output to look like this

<OrderContainer xmlns="http://blabla/api/products" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

So I added the following to my XmlSerializer

XmlSerializer x = new XmlSerializer(typeof(OrderContainer));
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "http://blabla/api/products");
ns.Add("i", "http://www.w3.org/2001/XMLSchema-instance");
// do stuff..
x.Serialize(stream, orderContainer, ns);

But now I get

<OrderContainer xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

So how do I edit the default namespace?


My object definition is like:

[System.Runtime.Serialization.DataContractAttribute(Name="OrderContainer", Namespace="http://blabla/api/products")]
[System.SerializableAttribute()]
public partial class OrderContainer

Upvotes: 6

Views: 8704

Answers (3)

John Saunders
John Saunders

Reputation: 161821

You have to use [XmlElementAttribute], not [DataContractAttribute], if you wish to use the XML Serializer.

Upvotes: 2

Darin Dimitrov
Darin Dimitrov

Reputation: 1039398

You could use the XmlSerializer constructor which takes a default namespace in addition to the type you want to serialize:

var x = new XmlSerializer(
    typeof(OrderContainer), 
    "http://blabla/api/products");
var ns = new XmlSerializerNamespaces();
ns.Add("i", "http://www.w3.org/2001/XMLSchema-instance");
x.Serialize(stream, orderContainer, ns);

Upvotes: 10

Jan Jongboom
Jan Jongboom

Reputation: 27342

Ah, had to use DataContractSerializer, which automatically generates correct XML, including the namespaces.

DataContractSerializer dcs = new DataContractSerializer(typeof(OrderContainer));
//do stuff..
dcs.WriteObject(s, orderContainer);

Upvotes: 0

Related Questions