2010-02-26 20 views
49

Estoy buscando una forma con C# que puedo serializar una clase en XML y agregar un espacio de nombres, pero defino el prefijo que usará ese espacio de nombres.Serialización XML y prefijos de espacio de nombres

En última instancia estoy tratando de generar el siguiente código XML:

<myNamespace:Node xmlns:myNamespace="..."> 
    <childNode>something in here</childNode> 
</myNamespace:Node> 

que sé tanto con el DataContractSerializer y la XmlSerializer puedo añadir un espacio de nombres, pero parecen generar un prefijo internamente, con algo que yo No soy capaz de controlar. ¿Puedo controlarlo con cualquiera de estos serializadores (puedo usar cualquiera de ellos)?

Si no puedo controlar la generación de los espacios de nombres, tendré que escribir mi propio serializador XML, y si es así, ¿cuál es el mejor para escribirlo?

Respuesta

84

Para controlar el alias del espacio de nombres, use XmlSerializerNamespaces.

[XmlRoot("Node", Namespace="http://flibble")] 
public class MyType { 
    [XmlElement("childNode")] 
    public string Value { get; set; } 
} 

static class Program 
{ 
    static void Main() 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("myNamespace", "http://flibble"); 
     XmlSerializer xser = new XmlSerializer(typeof(MyType)); 
     xser.Serialize(Console.Out, new MyType(), ns); 
    } 
} 

Si necesita cambiar el espacio de nombres en tiempo de ejecución, puede utilizar adicionalmente XmlAttributeOverrides.

+4

+1 pero podría sugerir una edición para dejar en claro que el primer parámetro en el método .Add es el lugar donde ocurre la magia para establecer el prefijo. No estaba claro para mí por la respuesta hasta que revisé los documentos de MSDN. –

+0

es justo suponer que no hay un equivalente con DataContractSerializer? (Solo quiero mantener mis opciones abiertas) –

+0

@Slace - sí, creo que es seguro suponer que ** no es ** un equivalente para DCS. En última instancia, DCS no tiene la intención de darle mucho control sobre la salida (si desea controlar el xml, use 'XmlSerializer', ese es su trabajo). –

3

Al usar código generado de un esquema donde los tipos tienen espacios de nombres, esta anulación del espacio de nombres se aplica en el nivel raíz, pero las etiquetas dentro de tipos variables tendrán el espacio de nombres asociado a la clase.

Tuve la necesidad de usar dos clases diferentes generadas pero con espacios de nombre diferentes según el servidor con el que estaba hablando (no preguntes, no bajo mi control).

Probé todas las sustituciones que se ofrecen aquí y finalmente me rendí y usé un tipo de método de fuerza bruta que realmente funcionó bastante bien. Lo que hice fue serializar a una cadena. A continuación, utilice string.replace para cambiar los espacios de nombres y luego publique la secuencia de la cadena mediante el uso de un stringwriter. Lo mismo en la respuesta: capturar a una cadena: manipular el espacio de nombres y luego deserializar la cadena de un escritor de cadenas.

Puede que no sea elegante o utilice todas las anulaciones elegantes, pero hizo el trabajo.

Cuestiones relacionadas