Recibir XML por parámetro en Web Services C#

Para poder recibir un XML por parámetros tenemos varias opciones, sin embargo en este tutorial veremos un objeto llamado XmlDocument el cual nos permitirá recibir la estructura completa, y luego podremos aprovechar las herramientas que nos provee .NET para poder leerlo de una manera muy simple.

XML

CÓDIGO

Como podemos apreciar recibimos un objeto XmlDocument el cual es del package System.Xml y luego lo convertimos en un objeto XDocument (System.Xml.Linq), este objeto nos permite utilizar las características de Linq sobre un XML, lo cual nos hace mucho más simple la lectura.

from row //asignamos el alias row
in XDocument.Parse(xml.OuterXml). //Conversión a XML compatible con linq
Descendants(“tabla”) // Obtenemos todos los tag con nombre “tabla”
select row.Attribute(“id”).Value.ToUpper() // Seleccionamos solo el atributo id de cada tag
).First(); // Obtenemos solo el primer resultado de la consulta

Como enviar el XML al Ws

Desde nuestra aplicación creamos un objeto XmlDocument y se lo enviamos al ws de la siguiente manera.

Vamos a suponer que ya agregamos la referencia web a nuestro proyecto y el import correspondiente.

Esperamos sea de su utilidad

Saludos

Publicado en C Sharp Etiquetado con: , ,
17 Comentarios en “Recibir XML por parámetro en Web Services C#
  1. Cristy dice:

    Esto funciona?, porque me marca un error al sobrecargar el metodo, me dice que no hay ninguna sobrecarga….

    public string ReferenciaServicioWeb()
    {
    XmlDocument doc = new XmlDocument();
    doc.Load(@”C:\\salida\\miXML.xml”);
    servicioWebReferencia.servicioWebSoapClient servicioWeb = new servicioWebReferencia.servicioWebSoapClient();
    return servicioWeb.Leer(doc);

    • Estimado el método esta probado desde la versión 3,5 del Framework.Net, verifica tus using sobre todo (using System.Xml.Linq)

      Saludos

      • Cristy dice:

        No logro que me cargue el XML, verás en un servicio de windows, primero creo el XML y lo guardo, en el OnStart() y en otro método lo obtengo de la forma que explicas arriba, pero al querer instalar el servicio, simplemente no lo ejecuta. Sabrás porqué me ocurre esto?? :'(

        • Puedes copiar la forma en que lo estas usando y una impresión del XML. Así tendré información para ayudarte.

          • Cristy dice:

            public string Archivo()
            {
            XmlDocument doc = new XmlDocument();//Crea objeto de tipo XmlDocument.
            servicioWeb servicio = new servicioWeb();//Crea objeto de tipo servicioWeb.
            string[] xmlfiles = Directory.GetFiles(@”C:\\entrada\\”, “*.xml”);//Obtiene todos los archivos que se encuentren en “C:\\entrada\\” de tipo .xml y los mete en un arreglo.

            if (xmlfiles.Length > 0)//si la longitud de la variable declarada como arreglo para que guarde los archivos es mayor de cero.
            {
            string xmlfile = xmlfiles[0];//pasa el archivo que se encuentra en el arreglo a una variable de tipo string.
            doc.Load(xmlfile);//carga el archivo .xml que se encuentra en la viariable.
            string entrada = Path.GetFileName(xmlfile);
            return servicio.Leer(entrada);

            }

            return servicio.Leer();

            }

            me tira el siguiente error:

            no se puede implementar el método o la operación

            pero depurandolo, el return en (entrada) si lleva el documento, solo que me marca ese error.

          • Prueba cambiando tu XML por el xml de este ejemplo, se me ocurre que el formato puede ser inválido, si no es eso te recomiendo eliminar el contenido de la carpeta object por completo y volver a intentar.

          • Cristy creo que es la implementación completa la que esta fallando. Esto se compone de dos partes el web services que necesita un objeto de tipo XmlDocument y un cliente el cual envia el XmlDocument. Te recomiendo tratar de implementar este ejemplo tal cual esta y luego cambiar la forma de crear el XML, de esta manera podrás descartar errores, quizas el XML no esta bien conformado.

          • Cristy dice:

            el Xml lo creo de la siguiente manera….

            System.Xml.Linq.XDocument sXML = new XDocument( //crea objeto de tipo documento XML.
            new XDeclaration(“1.0”, “utf-8”, “yes”),//declaración de los elementos que componen el archivo .xml.
            new XElement(“Ejemplo”,
            new XElement(“Fecha”, sFecha),
            new XElement(“Emisor”,
            new XElement(“RFC”, “EIZC920727Q13”),
            new XElement(“UUID”, “560A8451-A29C-41D4-A716-54467655440000”)),

            new XElement(“Receptor”,
            new XElement(“RFC”, “COMA910516R1225”),
            new XElement(“UUID”, “560A8451-A29C-41D4-A716-544676554400”))
            )
            );

            algo anda mal ahí?

          • Cristy dice:

            Podrías poner el código con el que creaste el XML, por favor?

  2. caliman0994 dice:

    y si quiero leer todos los datos no solo uno como seria???

    • Puedes crear un nuevo objeto solo agregando el resto de los atributos.


      select new {
      ID = row.Attribute(“id”).Value.ToUpper(),
      ID2 = row.Attribute(“id2”).Value.ToUpper(),
      ID3 = row.Attribute(“id3”).Value.ToUpper()
      });

      Si quieres mas de una fila simplemente omite el First();

      Saludos

  3. Guillermo dice:

    Una pregunta tienes algún código para extraer el UUID de un CFDI ya sea en Visual Basic u en Visual C#, espero de verdad me puedas ayudar

  4. Carlos Alberto Rodriguez dice:

    Hola Victor !!
    Tu ejemplo funciona Ok
    Ahora entendiendo ese proceso tengo que enviar un xml a un Web service
    pero realmente es muy diferente.
    Te mando el código del lado del WebServis por si me podes aunque sea aclararme la duda, desde ya muchas gracias.
    ===========================================
    EJEMPLOS DE INVOCACIÓN Y RESPUESTA
    ———————————-
    OPERACIÓN OBTENERINTERFAZ
    ———————————-

    Request

    solicitar

    solicitar
    solicitar

    solicitar
    solicitar
    ARG

    Allianz

    CSV
    PPA

    FECHA_EMISION
    MAYOR
    15012014

    FECHA_EMISION
    MENOR_IGUAL
    14022014

    PRODUCTOR
    IGUAL
    solicitar

    =============================================

  5. Saúl Dueñas B. dice:

    buen aporte, solo tengo una duda, en tema de seguridad, es conveniente utilizar como parametros un xml, por que en eso modo en donde se haga una implementación asi correo el riesgo de ataques por injección XML.

    Es una buena practica hacer una implementación de ese modo ?

  6. Gammy dice:

    Hola me ha funcionado excelente, pero si quisiera consumir el método con php o Js se podría

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*