** 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
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: 18/Agosto/2016 a las 18:12
Hola!


llevaba mucho tiempo queriendo conectar una BD de Access a un sistema remoto a través de SOAP y fespues de encontrar en el foro este estupendo tutorial (https://www.youtube.com/watch?v=jOkoWa284zE) , me he tirado a la piscina:

el caso es que consigo que el sistema remoto me devuelva el XML, pero no puedo leer el valor de un nodo, concretamente el nodo MobilePhone)


por ahora el código que tengo es: (disculpad que borre algunos valores, puesto que son contraseñas o IP privadas, las he substituido por ++++++:

----------------


Option Compare Database



Private Sub lanzar_XML_Click()
Dim sUrl As String
Dim sEnv As String
Dim xmlhtp As MSXML2.XMLHTTP60
Dim xmlDoc As MSXML2.DOMDocument60
Dim limpiartexto As String
Dim Valoresxml  As MSXML2.IXMLDOMNode



sUrl = "++++++"

sEnv = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:hai=""++++++"">"
sEnv = sEnv & "   <soapenv:Header/>"
sEnv = sEnv & "   <soapenv:Body>"
sEnv = sEnv & "      <hai:QuerySRInfo>"
sEnv = sEnv & "         <SRNum>EUES160624000378</SRNum>"
sEnv = sEnv & "         <ServiceCenterId>++++++</ServiceCenterId>"
sEnv = sEnv & "         <ServiceCenterPW>++++++</ServiceCenterPW>"
sEnv = sEnv & "      </hai:QuerySRInfo>"
sEnv = sEnv & "   </soapenv:Body>"
sEnv = sEnv & "</soapenv:Envelope>"
Set xmlhtp = New MSXML2.XMLHTTP60
With xmlhtp
.Open "POST", sUrl, False
.setRequestHeader "Content-Type", "text/xml;charset=UTF-8"
' .setRequestHeader "SOAPAction:", "rpc/http://www.++++++.com/:QuerySRInfo"
.setRequestHeader "Content-Length", "Lenght"
.send sEnv

Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.loadXML .responseText

limpiartexto = xmlDoc.XML
limpiartexto = Right(limpiartexto, Len(limpiartexto) - 327)
limpiartexto = Left(limpiartexto, Len(limpiartexto) - 64)

Debug.Print limpiartexto

End With

xmlDoc.loadXML limpiartexto

For Each Valoresxml In xmlDoc.getElementsByTagName("ServiceRequests")
Me.MobilePhone = Valoresxml.selectNodes("MobilePhone")(0).Text
MsgBox Valoresxml.selectNodes("MobilePhone")(0).Text

Next
End Sub

-------------------------

creo que mi problema es el formato de texto que me devuelve el XML, ya que no está "ordenado", aunque lo limpio de las lineas que sobran al principio y al final,  (como indica el toturial) sale todo como una cadena continua de texto: 

el debug.print me devuelve 


<ServiceRequests><ServiceRequest xmlns="http://www.siebel.com/xml/SPI%20HET%20ASC%20Query%20Service%20Request"><SrNumber>EUES160624000378</SrNumber><CustomerName>++++++</CustomerName><FirstName>++++++</FirstName><LastName>++++++</LastName><ContactEmail></ContactEmail><MobilePhone>600600600</MobilePhone><HomePhone></HomePhone><WorkPhone></WorkPhone><CustomerGender></CustomerGender><CustomerCoutnry>Spain</CustomerCoutnry><CustomerState></CustomerState

<SubmissionTime></SubmissionTime><OfflineSubmissionTime></OfflineSubmissionTime></ServiceRequest></ServiceRequests>



Alguna pista de cómo conseguir que el texto que devuelve esté mejor "formateado"? (si es que es eso!)



Editado por poseido - 18/Agosto/2016 a las 18:13
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4898
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 18:47
Me imagino que el autor del video no sabe explicar.

Lo que obtienes de respuesta es un xml, y una forma de poder obtener el nodo que quieres es mediante msxml con DOM, que es justo como lo hacen en el video. Si pones la respuesta del xml que te devuelve y explicas que información es la que quieres obtener quizás te podemos ayudar.

PD: no es que este mal formateado es que así es un archivo XML, también pudieras lograr con las funciones de texto lo que quieres pero creo que es mejor usar Dom.

Saludos.


Editado por emiliove - 18/Agosto/2016 a las 18:49
Arriba
poseido Ver desplegable
Habitual
Habitual


Unido: 16/Octubre/2009
Estado: Sin conexión
Puntos: 157
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 19:00
hola; gracias por la rápida respuesta.

EDIT: ahroa que veo tu nick.. eres el autor del video? gracias!!!!!!

mi código almacena el XML devuelto en xmlDoc.XML
luego limpio las cabeceras y el final del texto con l

impiartexto = xmlDoc.XML
limpiartexto = Right(limpiartexto, Len(limpiartexto) - 327)
limpiartexto = Left(limpiartexto, Len(limpiartexto) - 64)

Debug.Print limpiartexto

y despues muestro a través del debug print el valor de mi xml (ahora almacenado en limpiartexto)

como indicaba, ese valor es una línea:

<ServiceRequests><ServiceRequest xmlns="http://www.siebel.com/xml/SPI%20HET%20ASC%20Query%20Service%20Request"><SrNumber>EUES160624000378</SrNumber><CustomerName>++++++</CustomerName><FirstName>++++++</FirstName><LastName>++++++</LastName><ContactEmail></ContactEmail><MobilePhone>600600600</MobilePhone><HomePhone></HomePhone><WorkPhone></WorkPhone><CustomerGender></CustomerGender><CustomerCoutnry>Spain</CustomerCoutnry><CustomerState></CustomerState><SubmissionTime></SubmissionTime><OfflineSubmissionTime></OfflineSubmissionTime></ServiceRequest></ServiceRequests>

y creo que debería devolver algo así:


<ServiceRequests>
 <ServiceRequest xmlns="http://www.siebel.com/xml/SPI%20HET%20ASC%20Query%20Service%20Request">    
  <SrNumber>EUES160624000378</SrNumber>
  <CustomerName>++++++</CustomerName>
  <FirstName>++++++</FirstName>
  <LastName>++++++</LastName>
  <ContactEmail></ContactEmail>
  <MobilePhone>600600600</MobilePhone>
  <HomePhone></HomePhone>
  <WorkPhone></WorkPhone>
  <CustomerGender></CustomerGender>
  <CustomerCoutnry>Spain</CustomerCoutnry>
  <CustomerState></CustomerState>
  <SubmissionTime></SubmissionTime>
  <OfflineSubmissionTime></OfflineSubmissionTime>
 </ServiceRequest>
</ServiceRequests>



mi objetivo es leer el valor de "MobilePhone" mostrandolo en un formulario en Me.MobilePhone  y lo intento como el autor, con este código:

For Each Valoresxml In xmlDoc.getElementsByTagName("ServiceRequests")
Me.MobilePhone = Valoresxml.selectNodes("MobilePhone")(0).Text
MsgBox Valoresxml.selectNodes("MobilePhone")(0).Text

Next



Editado por poseido - 18/Agosto/2016 a las 19:06
Arriba
emiliove Ver desplegable
Moderador
Moderador


Unido: 16/Junio/2009
Localización: Mexico
Estado: Sin conexión
Puntos: 4898
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 19:28
Has una prueba graba el xml ya recortado y ábrelo con el explorador a ver si no te da error, el formateado podríamos decir que no es tan importante, lo que importa es que en el explorador puedas abrir el xml y no muestre error.

Ya comentas para continuar.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10816
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 19:51
Tienes ese formato (todo en una línea) porque ese XML está creado con DOM, el mismo es correcto, prueba a 'verlo' con el IExplorer (como te dice Emiliove) o un editor que soporte el XML por ejemplo el NotePad+++.

Mírate este ejemplo de leer ficheros con DOM a ver si te ayuda.



Editado por Mihura - 18/Agosto/2016 a las 19:52
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: 18/Agosto/2016 a las 20:09
Hola

gracias a los dos por las respuestas.

he seguido vuestro consejo y veo que parece ser que el "churro" que me devuelve el interfaz, se corta; es decir, tiene dos retornos de carro en el medio
parece que el churro es tan largo que "algo" (no se si la ventana de "inmediato", el código VBA, o el propio servidor lo corta (dudop que sea el servidor por que funciona bien desde SOAPUI))

vuelo a la idea original de que el problema es el formato del texto devuelto


alguna pista?


NOTA: en mi primer post, por simplificar, recorté la línea que me devuelve el servicio; es mucho más larga por que tiene muchos nodos, la real (cambiando  toda la info que sea privada es:

<ServiceRequests><ServiceRequest xmlns="http://www.siebel.com/xml/SPI%20HET%20ASC%20Query%20Service%20Request"><SrNumber>EUES160624000378</SrNumber><CustomerName>Gonzalez CASTREJON</CustomerName><FirstName>Manuel</FirstName><LastName>Gonzalez CASTREJON</LastName><ContactEmail></ContactEmail><MobilePhone>676333319</MobilePhone><HomePhone></HomePhone><WorkPhone></WorkPhone><CustomerGender></CustomerGender><CustomerCoutnry>Spain</CustomerCoutnry><CustomerState></CustomerState><CustomerCity>Ribera Del Fresno</CustomerCity><CustomerZipcode>06225</CustomerZipcode><StreetName>-</StreetName><StreetNo>-</StreetNo><DetailAddress>C/ lope de vega NR 6</DetailAddress><CustomerEmail></CustomerEmail><CustMobilePhone>67644443119</CustMobilePhone><CustHomePhone></CustHomePhone><CustWorkPhone></CustWorkPhone><CallBy>Shop</CallBy><CallFirstName></CallFirstName><CallLastName></CallLastName><CallMobilePhone></CallMobilePhone><CallHomePhone></CallHomePhone><CallWorkPhone></CallWorkPhone><CallEmail></CallEmail><ProductGroup>TV</
ProductGroup><LocalProduct>TV</LocalProduct><LocalSubProduct></LocalSubProduct><Brand>ACCESS</Brand><DateOfPurchase>11/28/2015</DateOfPurchase><ModelName>ASDASFAS</ModelName><ServiceModel>ASFDW</ServiceModel><ProductCode>DM0080M0100</ProductCode><SerialNum>DM008434343400D6D3R1718</SerialNum><ManufactureDate></ManufactureDate><SoftwareVersion>00</SoftwareVersion><IMEI1></IMEI1><IMEI2></IMEI2><OrderType>In Warranty</OrderType><CallType></CallType><L1>Customer service</L1><L2>Function issue</L2><L3>Automatical tune problem</L3><Source>Call Center</Source><Channel>EU</Channel><SCCount></SCCount><SrCreationDate>06/24/2016 00:00:00</SrCreationDate><Status>Accept</Status><SubStatus></SubStatus><SubStatusComments></SubStatusComments><SettlementStatus></SettlementStatus><SetttlementFeedback></SetttlementFeedback><AuditAdjustReason></AuditAdjustReason><Redispatch></Redispatch><RepatchReason></RepatchReason><Reopen></Reopen><ReopenReason></ReopenReason><ReopenId></ReopenId><RollingRepairFlag></RollingRepairFlag><TechDocUp
d>N</TechDocUpd><TechDocUpdDate>N</TechDocUpdDate><ServiceBulletinNum></ServiceBulletinNum><CustomerDescription>NO FUNCIONA</CustomerDescription><Comments>RECOGER Y ENTREGAR EN TIENDA:
ASDGASF CASH / 06225, Ribera Del Fresno , - AV fresno / 5234555 MARIA JOSE - 10 A 14 Z 18 A 21</Comments><CustomerClass>Normal</CustomerClass><DealerName></DealerName><ParentSrNum></ParentSrNum><ReminderFlag></ReminderFlag><ScMesg>EUES160624000378</ScMesg><CustomerType>Household-user</CustomerType><Parts></Parts><LastUpdateTime>07/07/2016 17:45:46</LastUpdateTime><PendingReasons></PendingReasons><ServiceType></ServiceType><Finances></Finances><Transferstatus></Transferstatus><Activities></Activities><EntryTime></EntryTime><SubmissionTime></SubmissionTime><OfflineSubmissionTime></OfflineSubmissionTime></ServiceRequest></ServiceRequests>



creo que el quid está en esos retornos de carro que no deberían estar






Editado por poseido - 18/Agosto/2016 a las 20:33
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10816
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 20:44
Si crees que es eso, prueba a quitárselos, cambiándolos por un blanco (por ejemplo).

Para ver el fichero tal cual (y poder analizarlo), deberías guardar directamente desde VBA el fichero recibido como un archivo de texto.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10816
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 20:51
He copiado y pegado lo que pones en tu post, he quitado los retornos de carro que tiene, dejándolo en una sola línea, lo he guardado y después abierto con el IE y se ve perfectamente.


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: 4898
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 20:54
Lo que da error es el espacio de nombre, quítalo y prueba de nuevo con:

MsgBox xmlDoc.selectSingleNode("//MobilePhone").Text

Recuerdo que Jesús ya a tenido problemas con el, pero no indicó como lo elimino, yo te diría que con Xslt se puede, pero talvez la forma de Jesús es mucho mas fácil. Aunque puedes usar las funciones de texto para quitar esa parte también. 
Pero que sacrilegio como que como archivo de texto mejor con xmlDoc.Save "Nombrequequiera.xml"

Saludos.


Editado por emiliove - 18/Agosto/2016 a las 21:22
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10816
Enlace directo a este mensaje Enviado: 18/Agosto/2016 a las 21:55
Lo que da problemas es:

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

Cámbialo a:

<ServiceRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

y pruébalo.

Private Sub CmdSelCodigoA_Click()
Dim xNodes As MSXML2.IXMLDOMNodeList
Dim xNode As IXMLDOMNode
  
    Set xDoc = New MSXML2.DOMDocument60
    xDoc.async = False
    xDoc.Load (CurrentProject.Path & "\pruebaforo.xml")
    
    Set xNodes = xDoc.selectNodes("//MobilePhone")
    For Each xNode In xNodes
        Debug.Print xNode.Text
    Next
    Set xDoc = Nothing
End Sub


El cambio del literal lo he hecho a capón, veo que habrá que hacer una rutina, porque esto está siendo más habitual de lo que parece, .... ¡que vivan los estándares!







Editado por Mihura - 18/Agosto/2016 a las 21:58
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: 4898
Enlace directo a este mensaje Enviado: 19/Agosto/2016 a las 00:00
Para eliminar el espacio de nombre y no preocuparnos mas por el, a nuestro xml le pasamos la transformación, el archivo xsl es:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="." />
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="text() | comment() | processing-instruction()">
        <xsl:copy />
    </xsl:template>
</xsl:stylesheet>

No importa si tiene el xml o no espacio de nombre, solo en caso de tenerlo lo elimina, si no tiene, no pasa absolutamente nada.
La rutina es la que vimos en la platica de transformaciones, que fue:


Private Sub Transform(sourceFile, stylesheetFile, resultFile)

Dim source As New MSXML2.DOMDocument60
Dim stylesheet As New MSXML2.DOMDocument60
Dim result As New MSXML2.DOMDocument60

source.async = False
source.Load sourceFile

stylesheet.async = False
stylesheet.Load stylesheetFile

If (source.parseError.errorCode <> 0) Then
    MsgBox ("Error loading source document: " & source.parseError.reason)
    Else
If (stylesheet.parseError.errorCode <> 0) Then
       MsgBox ("Error loading stylesheet document: " & stylesheet.parseError.reason)
    Else
       
       source.transformNodeToObject stylesheet, result
       result.Save resultFile
       
End If
End If



Editado por emiliove - 19/Agosto/2016 a las 00:04
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 08:04
Publicado originalmente por emiliove emiliove escribió:

Lo que da error es el espacio de nombre, quítalo y prueba de nuevo con:

MsgBox xmlDoc.selectSingleNode("//MobilePhone").Text

Recuerdo que Jesús ya a tenido problemas con el, pero no indicó como lo elimino, yo te diría que con Xslt se puede, pero talvez la forma de Jesús es mucho mas fácil. Aunque puedes usar las funciones de texto para quitar esa parte también. 
Pero que sacrilegio como que como archivo de texto mejor con xmlDoc.Save "Nombrequequiera.xml"

Saludos.
hola; gracias por la pista; si lo grabo a fichero directamente como tu dices, el XML es perfecto, no hay esos retornos de carro, por lo que entiendo que el problema es que la línea es muy larga para la ventana de Inmediato y añade esos retornos, pero en la variable en sí, no existen.



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


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

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 10816
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
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: 10816
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
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable