Imprimir página | Cerrar ventana

SOAP y Access

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=82048
Fecha de impresión: 20/Abril/2019 a las 16:25


Tema: SOAP y Access
Publicado por: poseido
Asunto: SOAP y Access
Fecha de publicación: 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!)




Respuestas:
Publicado por: emiliove
Fecha de publicación: 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.


Publicado por: poseido
Fecha de publicación: 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



Publicado por: emiliove
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com/ejemplos.html#m12" rel="nofollow - http://www.accessaplicaciones.com/ejemplos.html#m12


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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: poseido
Fecha de publicación: 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






Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: emiliove
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 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!







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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: emiliove
Fecha de publicación: 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



Publicado por: poseido
Fecha de publicación: 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.

No soy capaz de pegar la imagen del XML aqui, este es el link:  https://lh3.googleusercontent.com/y27rGhGMtGkjF9TrMKUv0EjKRtH3kvP5FML-eIJW340VnNA6yEKTeGqRYvbERskd3SL7wcD9MqumN199Cq-eroh-wKEaZQs5ukiU5JlKrLJyUlor-llSnyVPcKSfHOx32o7Xv7OZwTIj1ZYdibRQO8rI4iAdK6Dd9_XrFTHLJwDiXqJV6kd7Az8hPNlhDp0tdCOCyEJbRFEsJQNPOtAlEn-KpX0mQFMvkr2FeGkWqQq1tICPjNHbGWjHY2c7ip1qEkH7WdRCurD5BiyTNr4PLQRnwNGicW3nvtqmwHN07Mhp0SCzdfkMPB13myutR-5TS1q6u9E3IyyPaNRCj3eS0am7kibzgSS4jurOvii6UThpfAM2UfG6ySZUsQZ2Nm3bc7Libj5dPGPYVVlriD_lo9C5lNLtbr36VBANnedLyxi8MpVHNrylOd8dM7782Hznu-T_RB8qpT-CATih1-uexGpw87FAmpnUl45F9n1pB7qAryAvvlo8FZF5bDIJo6-jvki1hKRDa3s9CNq-DGd2IWj3XHA8eGRciEUsXrSRQxnntjpD13HsG5j0MQeYkDf4MGgJmi5ruz9YhZ-QrMpObNICtqh6VGVD=w1253-h1019-no" rel="nofollow - https://lh3.googleusercontent.com/y27rGhGMtGkjF9TrMKUv0EjKRtH3kvP5FML-eIJW340VnNA6yEKTeGqRYvbERskd3SL7wcD9MqumN199Cq-eroh-wKEaZQs5ukiU5JlKrLJyUlor-llSnyVPcKSfHOx32o7Xv7OZwTIj1ZYdibRQO8rI4iAdK6Dd9_XrFTHLJwDiXqJV6kd7Az8hPNlhDp0tdCOCyEJbRFEsJQNPOtAlEn-KpX0mQFMvkr2FeGkWqQq1tICPjNHbGWjHY2c7ip1qEkH7WdRCurD5BiyTNr4PLQRnwNGicW3nvtqmwHN07Mhp0SCzdfkMPB13myutR-5TS1q6u9E3IyyPaNRCj3eS0am7kibzgSS4jurOvii6UThpfAM2UfG6ySZUsQZ2Nm3bc7Libj5dPGPYVVlriD_lo9C5lNLtbr36VBANnedLyxi8MpVHNrylOd8dM7782Hznu-T_RB8qpT-CATih1-uexGpw87FAmpnUl45F9n1pB7qAryAvvlo8FZF5bDIJo6-jvki1hKRDa3s9CNq-DGd2IWj3XHA8eGRciEUsXrSRQxnntjpD13HsG5j0MQeYkDf4MGgJmi5ruz9YhZ-QrMpObNICtqh6VGVD=w1253-h1019-no


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


Publicado por: Mihura
Fecha de publicación: 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'




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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: poseido
Fecha de publicación: 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!!!!


Publicado por: Mihura
Fecha de publicación: 19/Agosto/2016 a las 11:22
Esta es una explicación bastante decente:

http:////es.wikipedia.org/wiki/XPath" rel="nofollow - http://es.wikipedia.org/wiki/XPath



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

http://www.w3schools.com/xsl/xpath_syntax.asp" rel="nofollow - http://www.w3schools.com/xsl/xpath_syntax.asp


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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: poseido
Fecha de publicación: 19/Agosto/2016 a las 11:38
Publicado originalmente por Mihura Mihura escribió:

Esta es una explicación bastante decente:

http:////es.wikipedia.org/wiki/XPath" rel="nofollow - http://es.wikipedia.org/wiki/XPath



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

http://www.w3schools.com/xsl/xpath_syntax.asp" rel="nofollow - http://www.w3schools.com/xsl/xpath_syntax.asp

mucahs gracias! lo leeré



Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: poseido
Fecha de publicación: 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!



Publicado por: emiliove
Fecha de publicación: 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.

http://dl.dropboxusercontent.com/u/79048771/SOAPpseido.rar" rel="nofollow - http://dl.dropboxusercontent.com/u/79048771/SOAPpseido.rar

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.



Publicado por: emiliove
Fecha de publicación: 19/Agosto/2016 a las 18:13
Ya funciona eran las Mayusculas

http://dl.dropboxusercontent.com/u/79048771/Soaposeido.accdb" rel="nofollow - https://dl.dropboxusercontent.com/u/79048771/Soaposeido.accdb

Saludos.



Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: emiliove
Fecha de publicación: 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.




Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: poseido
Fecha de publicación: 19/Agosto/2016 a las 21:47
Anonadado me quedo con el nivel en el foro...

Gracias!


Publicado por: emiliove
Fecha de publicación: 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.


Publicado por: Mihura
Fecha de publicación: 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.

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: poseido
Fecha de publicación: 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!





Imprimir página | Cerrar ventana