2009-12-07 1 views
6

Voglio la mia uscita a guardare come questoUsa XmlSerializer per aggiungere uno spazio dei nomi senza prefisso

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

Così ho aggiunto il seguente al mio 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); 

Ma ora ho

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

Quindi, come posso modificare lo spazio dei nomi predefinito?


La mia definizione di un oggetto è come:

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

risposta

10

È possibile utilizzare il XmlSerializer constructor che prende un namespace di default in aggiunta al tipo che si desidera serializzare:

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

Ah, ha dovuto utilizzare DataContractSerializer, che genera automaticamente corretto XML, compresi gli spazi dei nomi.

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

Devi usare [XmlElementAttribute], non [DataContractAttribute], se si desidera utilizzare il codice XML Serializer.

+0

Sì, erano solo alcune entità generate da WCF; quindi sono stati decorati con 'DataContractAttribute' –