serializar - xmlserializer c# example
Serialización XML y prefijos de espacio de nombres (2)
Estoy buscando una manera con C # que puedo serializar una clase en XML y agregar un espacio de nombres, pero definir el prefijo que usará ese espacio de nombres.
En definitiva, estoy tratando de generar el siguiente XML:
<myNamespace:Node xmlns:myNamespace="...">
<childNode>something in here</childNode>
</myNamespace:Node>
Sé que con el DataContractSerializer
y el XmlSerializer
puedo agregar un espacio de nombres, pero parecen generar un prefijo internamente, con algo que no puedo 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?
Cuando se usa 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 oportunidad de necesitar usar dos clases generadas diferentes, pero tengo diferentes espacios de nombre según el servidor con el que estaba hablando (no preguntes, no bajo mi control).
Probé todas las anulaciones que se ofrecieron aquí y finalmente me rendí y usé una especie 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 use todas las anulaciones elegantes, pero hizo el trabajo.
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, también puede usar XmlAttributeOverrides
.