Posts Tagged ‘xml’

WCF me añade un elemento root al serializar las clases

14 abril 2010

 

Problema: He creado una clase con un serializador a medida implementando el interfaz IXmlSerializable, pero WCF añade al xml resultante un elemento raiz adicional con el nombre de la clase y con un namespace propio.

Solucion: Tendremos que marcar la clase con el siguiente atributo para indicarle a WCF los valores para el nodo raiz:

[XmlRoot(Namespace=http://uri.org, ElementName="raiz")]

El atributo se encuentra en el namespace System.Xml.Serialization

WCF no me serializa a XML como yo quiero

14 abril 2010

 

Problema: Necesito serializar mis datos de una forma diferente a como lo hace el serializador que usa WCF (DataContractSerializer), ya sea porque sus opciones son limitadas (no permite usar atributos en el XML) o porque necesito una estructura diferente en el XML a la que me ofrece el serializador.

Solucion: Proveer a la clase a serializar de un serializador a medida, al que llamara WCF. Para ello hacemos que la clase a serializar  implemente el interfaz System.Xml.Serialization.IXmlSerializable. Deberemos implementar el metodo WriteXml donde podremos crear un XML a partir de la clase a mano y a nuestro gusto. (Nota: estaremos obligados a implementar tambien el metodo GetSchema, pero bastara con añadir una linea con “return null”

Que tengo que poner en el web.config para crear un servicio WCF que trabaje con soap, xml y json?

14 abril 2010

 

Problema: Quiero crear un servicio web con WCF con 3 endpoints, uno para soap, otro para json y otro para xml, y no se que tengo que especificar en el webconfig.

Solucion: Tras crear con VS nuestro proyecto WCF, ya tendremos el primer endopint creado para soap. Para los otros dos endpoints habria que añadir lo sieguiente:

Dentro de <system.serviceModel> añadimos la seccion <bindings> (si no esta ya)

<bindings>
        <webHttpBinding>
        <binding name="webBinding">
        </binding>
    </webHttpBinding>
</bindings>

En la seccion <services>, dentro del <service> que ya tendremos creado (y que ya contara con algun endpoint) añadimos dos mas

<endpoint name="xml" address="xml" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="XMLBehavior" contract="IContractService"/>

<endpoint name="json" address="json" binding="webHttpBinding" bindingConfiguration="webBinding" behaviorConfiguration="JSONBehavior" contract="IContractService"/>

 

Finalmente en la seccion <behaviors> añadimos

<endpointBehaviors>
<behavior name="XMLBehavior">
    <webHttp/>
</behavior>
<behavior name="JSONBehavior">
    <enableWebScript/>
</behavior>
</endpointBehaviors>

Por ultimo, si las llamadas xml las queremos hacer usando el metodo POST, deberemos marcar los metodos en cuestion del contrato con el atributo [WebInvoke(Method = “POST”)]. Ademas, tendremos que añadir una referencia a System.ServiceModel.Web en nuestro proyecto.

Extraer el XML formateado de un objeto XMLDocument

10 diciembre 2008

Problema: Tengo un objeto XmlDocument y quiero sacar el xml para meterlo en un objeto string. La propiedad innerXml no me vale porque me sale sin formatear, sin saltos de línea ni tabulaciones.

Solución: Usar un objeto XmlTextWriter. Para guardarlo en un objeto string necesitamos además un objeto StringWriter. Quedaría tal que así:

Using System.Xml;
Using System.IO;
StringWriter sw = new StringWriter();
 XmlTextWriter xw = new XmlTextWriter(sw);
 xw.Formatting = Formatting.Indented;
doc.WriteTo(xw);
 string resultado = sw.ToString();

(doc en este ejemplo se corresponde al objeto XmlDocument que contiene el xml)

Líos con .NET, XML, Prefijos y Namespaces

10 diciembre 2008

Problema: Estoy trabajando en .net con xml, usando para ello un objeto System.Xml.XmlDocument . El xml tiene unos prefijos delante del nombre de las etiquetas, y cuando intento operar con los nodos del documento me salen errores del tipo “Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.”

Solución: Los prefijos se corresponden a espacios de nombres (namespaces) de xml. Para poder trabajar con ellos debemos declarar el namespace y agregarlo a un objeto XmlNameSpaceManager. Luego en los métodos, deberemos incluir este objeto como un parámetro más.

Ejemplo:
string mgrName = “http://miNamespace.com“;
XmlNamespaceManager mgr = new XmlNamespaceManager(new NameTable());
mgr.AddNamespace(“p”, mgrName); 

(donde “p” sería el prefijo de las etiquetas)