** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - SOAP y Access
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoSOAP y Access

 Responder Responder Página  12>
Autor
Mensaje Invertir el orden de clasificación
poseido Ver desplegable
Habitual
Habitual


Unido: 16/Octubre/2009
Estado: Sin conexión
Puntos: 157
Enlace directo a este mensaje Tema: SOAP y Access
    Enviado: 20/Agosto/2016 a las 13:22
Hola, por mi parte está todo aclarado (y mucho más!).

gracias. 

yo por mi parte sigo con la BD a ver si puedo hacer la inversa, subir datos al servicor a traves de SOAP.

gracias!


Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11009
Enlace directo a este mensaje Enviado: 20/Agosto/2016 a las 12:10
Tengo yo que ponerme a estudiar el uso de las librerías DOM, que se lo justito. Unhappy

¡Que fácil queda!. Tongue


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4927
Enlace directo a este mensaje Enviado: 20/Agosto/2016 a las 01:16
Pero no has indicado si cerramos ya, mientras nos dices, pongo como usaría yo la función de Jesús usando solo msxml:


Private Sub Comando1_Click()
Dim xmldom As MSXML2.DOMDocument60
Set xmldom = New MSXML2.DOMDocument60
Dim x As String

    xmldom.Load CurrentProject.Path & "\pruebaforo.xml"
                        
    x = xmldom.XML
    x = RT_LimpiarCabXML(x, "ServiceRequest")
    Debug.Print x
    xmldom.loadXML x
    MsgBox xmldom.selectSingleNode("//MobilePhone").Text

Set xmldom = Nothing
End Sub

Function RT_LimpiarCabXML(StringXml As String, Clave As String) As String
Dim i As Integer, j As Integer
    i = InStr(1, StringXml, Clave & " ")
    j = InStr(i, StringXml, ">")
    RT_LimpiarCabXML = Mid$(StringXml, 1, i + Len(Clave)) & Mid$(StringXml, j)
End Function


Es indistinto usar selectNodes o selectSingleNode, ambos son métodos de selección de XPath, pero el método selectSingleNode devuelve el primer nodo que cumple con la selección, en cambio el método selectNodes devuelve una lista de nodos por eso declaramos IXMLDOMNodeList y creamos un bucle y solo entonces podemos obtener el nodo en cuestión, debemos usar selectNodes cuando se repite el nodo y queremos todos los valores y usar selectSingleNode cuando solo vamos a recoger un valor.

Saludos.

Editado por emiliove - 20/Agosto/2016 a las 02:00
Arriba
poseido Ver desplegable
Habitual
Habitual


Unido: 16/Octubre/2009
Estado: Sin conexión
Puntos: 157
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 21:47
Anonadado me quedo con el nivel en el foro...

Gracias!
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11009
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 19:35
Lo que hago es cargar el fichero completo en una variable, para poder modificar el literal que nos esta dando por saco.

Y el método más rápido de hacerlo (que yo conozca) es abrirlo como un fichero binario ...

¿Es esa la pregunta?


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4927
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 19:28
Bueno ya tiene dos formas (digo cuatro dos y dos) para entretenerse, una pregunta Jesús, porque abres el xml con Open y no con Msxml ¿Es mejor, o solo costumbre?

Saludos.




Editado por emiliove - 19/Agosto/2016 a las 19:29
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11009
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 18:57
Yo propongo un método más Espartano y más simple, ya que no necesitamos una StyleSheet.

No vuelvo a escribir el archivo en disco ya que gracias a Emiliove descubrí que existe xDoc.loadXML


Dos caminos:

El primero incluir el :xsi que nos hace falta:

Private Sub CmdArreglo1_Click()
Dim Xs As String, NumFic As Integer
Dim xNodes As MSXML2.IXMLDOMNodeList
Dim xNode As IXMLDOMNode

' abrimos el archivo XML
    NumFic = FreeFile
    Open CurrentProject.Path & "\pruebaforo.xml" For Binary As #NumFic
    Xs = Space$(LOF(1))
    Get #NumFic, , Xs
    Close #NumFic
    
    ' arreglamos la clave
    Xs = Replace(Xs, "xmlns=", "xmlns:xsi=", 1, 1)

    
    ' tratamos el XML
    Set xDoc = New MSXML2.DOMDocument60
    xDoc.async = False
    xDoc.loadXML Xs
    
    Set xNodes = xDoc.selectNodes("//MobilePhone")
    For Each xNode In xNodes
        Debug.Print xNode.Text
    Next
    Set xDoc = Nothing
End Sub



El segundo limpiar por completo la clave:

Private Sub CmdArreglo1_Click()
Dim Xs As String, NumFic As Integer
Dim xNodes As MSXML2.IXMLDOMNodeList
Dim xNode As IXMLDOMNode

  ' abrimos el archivo XML
    NumFic = FreeFile
    Open CurrentProject.Path & "\pruebaforo.xml" For Binary As #NumFic
    Xs = Space$(LOF(1))
    Get #NumFic, , Xs
    Close #NumFic
    
    ' llamamos a la funcion que nos limpia la clave indicada
    Xs = RT_LimpiarCabXML(Xs, "ServiceRequest")
    
    ' tratamos el XML
    Set xDoc = New MSXML2.DOMDocument60
    xDoc.async = False
    xDoc.loadXML Xs
    
    Set xNodes = xDoc.selectNodes("//MobilePhone")
    For Each xNode In xNodes
        Debug.Print xNode.Text
    Next
    Set xDoc = Nothing
End Sub

Function RT_LimpiarCabXML(StringXml As String, Clave As String) As String
Dim i As Integer, j As Integer
    i = InStr(1, StringXml, Clave & " ")
    j = InStr(i, StringXml, ">")
    RT_LimpiarCabXML = Mid$(StringXml, 1, i + Len(Clave)) & Mid$(StringXml, j)
End Function



Yo me voy a quedar con el segundo .... LOL. Gracias a Emiliove por la pista del LoadXML que me permite no tener que grabar en disco el archivo XML modificado.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4927
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 18:13
Ya funciona eran las Mayusculas


Saludos.

Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4927
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 16:57
Muy cierto Jesús, pero solo si intentamos escribir el XSL en el documento, si lo tenemos en un archivo funciona perfecto, me falta hacer mas pruebas sobre la codificación para detectar el error o tratar de hacerlo con Print Cry  pero de momento este es funcional.


Solo hay que colocar el archivo xsl en el mismo directorio que la base, y te crea un archivo xml de la respuesta del soap en el mismo directorio y de nombre Prueba.xml.

Saludos.

Arriba
poseido Ver desplegable
Habitual
Habitual


Unido: 16/Octubre/2009
Estado: Sin conexión
Puntos: 157
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 14:20
solo una pregunta más, el open y close que graba el fichero xml a disco... sobrescribe los ficheros, o al terminar la rutina debería borrar de alguna manera el fichero?
me estoy encontrando que el código no corre bien si no elimino los ficheros del disco.

he añadido este código just antes de crear el fichero corregido:

' comprobar si existe el fichero, y eliminarlo
      Dim aFile As String
      aFile = CurrentProject.Path & "\pruebaforo1.xml"
       If Len(Dir$(aFile)) > 0 Then
        Kill aFile
       End If


y ya me funciona bien todo.

millones de gracias!



Editado por poseido - 19/Agosto/2016 a las 14:26
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11009
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 11:42
Wink



Dejamos abierto el tema, para dar tiempo a Emililove si quiere aportar algo ...


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
poseido Ver desplegable
Habitual
Habitual


Unido: 16/Octubre/2009
Estado: Sin conexión
Puntos: 157
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 11:38
Publicado originalmente por Mihura Mihura escribió:

Esta es una explicación bastante decente:




Y ésta es mucho más explícita, aunque está en extranjero LOL


mucahs gracias! lo leeré

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11009
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 11:22
Esta es una explicación bastante decente:




Y ésta es mucho más explícita, aunque está en extranjero LOL



Editado por Mihura - 19/Agosto/2016 a las 11:24
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
poseido Ver desplegable
Habitual
Habitual


Unido: 16/Octubre/2009
Estado: Sin conexión
Puntos: 157
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 11:12
Mihura, es correcto; gracias

Ahora en la ventana de Inspección sí me aparece el valor del nodo del tlf móvil.

tengo una curiosidad, por qué cuando lees el nodo le pones el // delante? he visto un poco más arriba que se habla de "espacio de nombre", pero no lo entiendo



Gracias!!!!


Editado por poseido - 19/Agosto/2016 a las 11:14
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11009
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 10:59
Publicado originalmente por poseido poseido escribió:

P.D. emiliove y Mihura; en vuestra última respuesta me he perdido... mucho...
LOL



Verás, el problema reside en que esto no lo entiende:

<ServiceRequest xmlns="http://www.siebel.com/xml/SPI%20HET%20ASC%20Query%20Service%20Request">


Tiene que poner esto:

<ServiceRequest xmlns:xsi="http://www.siebel.com/xml/SPI%20HET%20ASC%20Query%20Service%20Request">

y ya funciona bien.


Para hacer ese cambio por código me he creado lo siguiente:

Private Sub CmdArreglo_Click()
Dim Xs As String, NumFic As Integer
Dim xNodes As MSXML2.IXMLDOMNodeList
Dim xNode As IXMLDOMNode

  ' abrimos el archivo XML
    NumFic = FreeFile
    Open CurrentProject.Path & "\pruebaforo.xml" For Binary As #NumFic
    Xs = Space$(LOF(1))
    Get #NumFic, , Xs
    Close #NumFic
    
    ' guardamos el XML cambiando el literal erroneo
    Open CurrentProject.Path & "\pruebaforo1.xml" For Binary As #NumFic
    Xs = Replace(Xs, "xmlns=", "xmlns:xsi=", 1, 1)
    Put #NumFic, , Xs
    Close #NumFic
    
    
    ' tratamos el XML
    Set xDoc = New MSXML2.DOMDocument60
    xDoc.async = False
    xDoc.Load (CurrentProject.Path & "\pruebaforo1.xml")
    
    Set xNodes = xDoc.selectNodes("//MobilePhone")
    For Each xNode In xNodes
        Debug.Print xNode.Text
    Next
    Set xDoc = Nothing
    
End Sub

Nota: lo he vuelto a escribir en un fichero porque si asigno la variable directamente al documento DOM:
              xDoc.Load (Xs)
... no furula, será algo a averiguar ...

Nota-2: Emililove, la solución que tu propones no me funciona, me da el siguiente error: 
El atributo 'Name' no es válido en 'xsl:element'




Editado por Mihura - 19/Agosto/2016 a las 11:03
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable