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

using System;
using System.Xml.Linq;
using System.Linq;
using System.Data;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System.Collections.Generic;

namespace WsQualityInfoSolutions
{
    [WebService(Namespace = "http://qualityinfosolutions.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]

    public class wsPruebaXML: System.Web.Services.WebService
    {
        [WebMethod]
        public string GetDatosXML(XmlDocument xml) 
        {
           string dato = "";

           dato = (from row in XDocument.Parse(xml.OuterXml).Descendants("tabla")
                   select row.Attribute("id").Value.ToUpper()).First();

           return dato;
        } 
    }
}

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.

 public string pruebaXML() {

   XmlDocument doc = new XmlDocument();
   doc.Load(@"C:\\Prueba.xml");

   wsPruebaXML PruebaXML = new wsPruebaXML();

   return PruebaXML.GetDatosXML(doc);
 }

Esperamos sea de su utilidad

Saludos

También te podría gustar...

23 Respuestas

  1. Elkin Ramos dice:

    Buenas a todos los que me puedan ayudar, tengo el siguiente código que menciono a continuacion, necesito de su ayuda para que al mometo de crear el xml en la parte de las fechas solo me escriba la fecha(dd/mm/yyyy) y en la Hora(HH:MM) solo la hora pero con formato de 24 horas
    Tambien estoy guardando el XML en un archvio, pero no se como guardarlo en una variable string, ya que el request del Web Service lo recibe asì

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using ClienteWSRemesas.WSRemesas;
    using System.Data;
    using System.Xml.Linq;
    using System.Globalization;
    using System.Threading;

    namespace ClienteWSRemesas
    {
    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void BtnEnviar_Click(object sender, EventArgs e)
    {

    WebServiceRnDcTSSoapClient EnviarRemesa = new WebServiceRnDcTSSoapClient();
    DSRemesas.A_WebRnDc_RemesasDataTable MisRemesas = EnviarRemesa.GetDataByNRem(TxtNumRemesa.Text);

    if (MisRemesas.Rows.Count == 0)
    {
    LblMensaje.Text = «La Remesa no existe»;
    //LblMensaje.Text = «La Remesa » + TxtNumRemesa + » no existe !!!»;
    //TxtNumRemesa.Text = «»;
    TxtCantidad.Text = «»;
    TxtNumRemesa.Focus();
    return;
    }
    DataRow miRegistro = MisRemesas.Rows[0];
    LblMensaje.Text = «»;
    TxtCantidad.Text = miRegistro[«CANTIDADCARGADA»].ToString();
    TxtNitEmpresa.Text = miRegistro[«NUMNITEMPRESATRANSPORTE»].ToString();
    TxtCodOpTransp.Text = miRegistro[«CODOPERACIONTRANSPORTE»].ToString();
    TxtCodNatCarga.Text = miRegistro[«CODNATURALEZACARGA»].ToString();
    TxtUnMedCap.Text = miRegistro[«UNIDADMEDIDACAPACIDAD»].ToString();
    TxtCodEmpaque.Text = miRegistro[«CODTIPOEMPAQUE»].ToString();
    TxtCantInfCarga.Text = miRegistro[«CANTIDADINFORMACIONCARGA»].ToString();
    TxtMercanciaRemesa.Text = miRegistro[«MERCANCIAREMESA»].ToString();
    TxtDescCortaProducto.Text = miRegistro[«DESCRIPCIONCORTAPRODUCTO»].ToString();
    TxtCodIdRemitente.Text = miRegistro[«CODTIPOIDREMITENTE»].ToString();
    TxtNumIdRemitente.Text = miRegistro[«NUMIDREMITENTE»].ToString();
    TxtCodSedeRemitente.Text = miRegistro[«CODSEDEREMITENTE»].ToString();
    TxtCodIdDestinatario.Text = miRegistro[«CODTIPOIDDESTINATARIO»].ToString();
    TxtNumIdDestinatario.Text = miRegistro[«NUMIDDESTINATARIO»].ToString();
    TxtCodSedeDestinatario.Text = miRegistro[«CODSEDEDESTINATARIO»].ToString();
    TxtDuenoPoliza.Text = miRegistro[«DUENOPOLIZA»].ToString();
    TxtNumPoliza.Text = miRegistro[«NUMPOLIZATRANSPORTE»].ToString();
    TxtCompSeguro.Text = miRegistro[«COMPANIASEGURO»].ToString();
    TxtFechaVctoPoliza.Text = miRegistro[«FECHAVENCIMIENTOPOLIZACARGA»].ToString();
    TxtHorasPactCargue.Text = miRegistro[«HORASPACTOCARGA»].ToString();
    TxtMinutosPactCargue.Text = miRegistro[«MINUTOSPACTOCARGA»].ToString();
    TxtHorasPactDescargue.Text = miRegistro[«HORASPACTODESCARGUE»].ToString();
    TxtMinutosPactDescargue.Text = miRegistro[«MINUTOSPACTODESCARGUE»].ToString();
    TxtFechaLlegadaCargue.Text = miRegistro[«FECHALLEGADACARGUE»].ToString();
    TxtHoraLlegadaCargue.Text = miRegistro[«HORALLEGADACARGUEREMESA»].ToString();
    TxtFechaEntradaCargue.Text = miRegistro[«FECHAENTRADACARGUE»].ToString();
    TxtHoraEntradaCargue.Text = miRegistro[«HORAENTRADACARGUEREMESA»].ToString();
    TxtFechaSalidaCargue.Text = miRegistro[«FECHASALIDACARGUE»].ToString();
    TxtHoraSalidaCargue.Text = miRegistro[«HORASALIDACARGUEREMESA»].ToString();
    TxtCodIdPropietario.Text = miRegistro[«CODTIPOIDPROPIETARIO»].ToString();
    TxtNumIdPropietario.Text = miRegistro[«NUMIDPROPIETARIO»].ToString();
    TxtCodSedePropietario.Text = miRegistro[«CODSEDEPROPIETARIO»].ToString();
    TxtFechaCitaPactCargue.Text = miRegistro[«FECHACITAPACTADACARGUE»].ToString();
    TxtHoraCitaPactCargue.Text = miRegistro[«HORACITAPACTADACARGUE»].ToString();
    TxtFechaCitaPactDescargue.Text = miRegistro[«FECHACITAPACTADADESCARGUE»].ToString();
    TxtHoraCitaPactDescargue.Text = miRegistro[«HORACITAPACTADADESCARGUEREMESA»].ToString();
    LblMensaje.Text = «La Remesa si existe»;
    }

    protected void BtnEnviarRnDc_Click(object sender, EventArgs e)
    {
    XDocument RnDcDocumento = new XDocument(new XDeclaration(«1.0», «ISO-8859-1», null));
    XElement nodoRaiz = new XElement(«root»);
    RnDcDocumento.Add(nodoRaiz);
    //Etiqueta Accesso
    XElement acceso = new XElement(«acceso»);
    acceso.Add(new XElement(«username», «ADMIN1@2468»));
    acceso.Add(new XElement(«password», «RNDC12345»));
    nodoRaiz.Add(acceso);
    //Etiqueta Solicitud
    XElement solicitud = new XElement(«solicitud»);
    solicitud.Add(new XElement(«tipo», «1»));
    solicitud.Add(new XElement(«procesoid», «3»));
    nodoRaiz.Add(solicitud);
    //Etiqueta Variables
    XElement variables = new XElement(«variables»);
    variables.Add(new XElement(«NUMNITEMPRESATRANSPORTE», TxtNitEmpresa.Text));
    variables.Add(new XElement(«CONSECUTIVOREMESA», TxtNumRemesa.Text));
    variables.Add(new XElement(«CODOPERACIONTRANSPORTE», TxtCodOpTransp.Text));
    variables.Add(new XElement(«CODNATURALEZACARGA», TxtCodNatCarga.Text));
    variables.Add(new XElement(«CANTIDADCARGADA», TxtCantidad.Text));
    variables.Add(new XElement(«UNIDADMEDIDACAPACIDAD», TxtUnMedCap.Text));
    variables.Add(new XElement(«CODTIPOEMPAQUE», TxtCodEmpaque.Text));
    variables.Add(new XElement(«CANTIDADINFORMACIONCARGA», TxtCantInfCarga.Text));
    variables.Add(new XElement(«MERCANCIAREMESA», TxtMercanciaRemesa.Text));
    variables.Add(new XElement(«DESCRIPCIONCORTAPRODUCTO», TxtDescCortaProducto.Text));
    variables.Add(new XElement(«CODTIPOIDREMITENTE», TxtCodIdRemitente.Text));
    variables.Add(new XElement(«NUMIDREMITENTE», TxtNumIdRemitente.Text));
    variables.Add(new XElement(«CODSEDEREMITENTE», TxtCodSedeRemitente.Text));
    variables.Add(new XElement(«CODTIPOIDDESTINATARIO», TxtCodIdDestinatario.Text));
    variables.Add(new XElement(«NUMIDDESTINATARIO», TxtNumIdDestinatario.Text));
    variables.Add(new XElement(«CODSEDEDESTINATARIO», TxtCodSedeDestinatario.Text));
    variables.Add(new XElement(«DUENOPOLIZA», TxtDuenoPoliza.Text));
    variables.Add(new XElement(«NUMPOLIZATRANSPORTE», TxtNumPoliza.Text));
    variables.Add(new XElement(«COMPANIASEGURO», TxtCompSeguro.Text));
    variables.Add(new XElement(«FECHAVENCIMIENTOPOLIZACARGA», TxtFechaVctoPoliza.Text));
    variables.Add(new XElement(«HORASPACTOCARGA», TxtHorasPactCargue.Text));
    variables.Add(new XElement(«MINUTOSPACTOCARGA», TxtMinutosPactCargue.Text));
    variables.Add(new XElement(«HORASPACTODESCARGUE», TxtHorasPactDescargue.Text));
    variables.Add(new XElement(«MINUTOSPACTODESCARGUE», TxtMinutosPactDescargue.Text));
    variables.Add(new XElement(«FECHALLEGADACARGUE», TxtFechaLlegadaCargue.Text));
    variables.Add(new XElement(«HORALLEGADACARGUEREMESA», TxtHoraLlegadaCargue.Text));
    variables.Add(new XElement(«FECHAENTRADACARGUE», TxtFechaEntradaCargue.Text));
    variables.Add(new XElement(«HORAENTRADACARGUEREMESA», TxtHoraEntradaCargue.Text));
    variables.Add(new XElement(«FECHASALIDACARGUE», TxtFechaSalidaCargue.Text));
    variables.Add(new XElement(«HORASALIDACARGUEREMESA», TxtHoraSalidaCargue.Text));
    variables.Add(new XElement(«CODTIPOIDPROPIETARIO», TxtCodIdPropietario.Text));
    variables.Add(new XElement(«NUMIDPROPIETARIO», TxtNumIdPropietario.Text));
    variables.Add(new XElement(«CODSEDEPROPIETARIO», TxtCodSedePropietario.Text));
    variables.Add(new XElement(«FECHACITAPACTADACARGUE», TxtFechaCitaPactCargue.Text));
    variables.Add(new XElement(«HORACITAPACTADACARGUE», TxtHoraCitaPactCargue.Text));
    variables.Add(new XElement(«FECHACITAPACTADADESCARGUE», TxtFechaCitaPactDescargue.Text));
    variables.Add(new XElement(«HORACITAPACTADADESCARGUEREMESA», TxtHoraCitaPactDescargue.Text));
    nodoRaiz.Add(variables);
    //Guardamos el XML en el archivo
    RnDcDocumento.Save(@»D:\UNIDAD_D\Programas\MinTransporte\WebService\AArchivosXML\prueba.xml»);
    //RnDcDocumento.CreateWriter
    LblMensaje.Text = «Listo XML.. guardado..!!!»;

    //WSRemesas.WebServiceRnDcTSSoapClient

    }
    }
    }

  2. mc_quake dice:

    Estimado:

    es posible que subas los archivos me resulta imposible hacerlo funcionar

    saluso

    • Estimado no poseemos los archivos de este ejemplo, pero funciona a la perfección debes tener un error en la forma de implementarlo, si lo deseas puedes compartirnos los errores que te aparecen.

  3. mc_quake dice:

    estimado puedes subir los archivos porfavor

  4. Gammy dice:

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

  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. 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

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

  7. 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

  8. 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

  9. 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?

          • No lo genere por código, pero si quieres una forma puedes ver este link https://www.qis.cl/como-generar-un-xml-a-partir-de-una-clase-en-c/

    • DataTable _dt = new Datatable
      _dt = (aca llenen sus datatable cons su metodo …. ADO.net)

      XDocument _XDocument = FuncionesStatic.DataTableToXDocument(_dt);
      XElement _XElement = FuncionesStatic.XDocumentToXElement(_XDocument);
      string valor = _ws.SetDatosXML(_XElement);

      Funciones

      public static XDocument DataTableToXDocument(DataTable dt)
      {
      using (var stream = new MemoryStream())
      {
      dt.WriteXml(stream);
      stream.Position = 0;
      XmlReaderSettings settings = new XmlReaderSettings();
      settings.ConformanceLevel = ConformanceLevel.Fragment;
      XmlReader reader = XmlReader.Create(stream, settings);
      reader.MoveToContent();
      if (reader.IsEmptyElement) { reader.Read(); return null; }
      return XDocument.Load(reader);
      }
      }
      public static XElement XDocumentToXElement(XDocument xDoc)
      {
      XElement xmlOut = XElement.Parse(xDoc.ToString());
      return xmlOut;
      }