2009-12-07 10 views
6

Quiero que mi salida para que parezca estaUso XmlSerializer para añadir un espacio de nombres sin un prefijo

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

por lo que añade lo siguiente a mi 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); 

Pero ahora tengo

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

Entonces, ¿cómo puedo editar el espacio de nombres predeterminado?


Mi definición de objeto es como:

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

Respuesta

10

Se podría utilizar el XmlSerializer constructor que tiene un espacio de nombres por defecto, además del tipo que desea serializar:

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, tuvo que usar DataContractSerializer, que genera automáticamente XML correcto, incluyendo los espacios de nombres.

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

Usted tiene que usar [XmlElementAttribute], no [DataContractAttribute], si desea utilizar el XML Serializador

+0

Sí, eran solo algunas entidades generadas por WCF; así que fueron decorados con 'DataContractAttribute' –

Cuestiones relacionadas