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
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
}
}
}
Estimado haz probado con .toString(«dd’/’MM’/’yyyy») y .toString(‘HH:mm’) respectivamente
Atte,
Víctor Riquelme
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.
estimado puedes subir los archivos porfavor
Hola me ha funcionado excelente, pero si quisiera consumir el método con php o Js se podría
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 ?
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
=============================================
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
XmlDocument doc = new XmlDocument();
doc.Load(fileName);
XmlElement root = doc.DocumentElement;
XmlNodeList nodeList = root.GetElementsByTagName(«cfdi:Complemento»);
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
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
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.
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.
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í?
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;
}