OVH Cloud OVH Cloud

HTMLdecode pour ACC97

9 réponses
Avatar
Olivier Delrieu
Cher Tous,

Je transfère des données XML de pages web vers une table d'une base acc97.
J'utilise les API de wininet.dll comme proposé dans:
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, les données XML ont cette tête là:
http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uids=7442

Forcement, la chaine que j'obtients est non formattée avec les caractères de
codages habituels HTML, genre :
<Date-std_year>2003</Date-std_year>
au lieu de:
<Date-std_year>2003</Date-std_year>

Question : dans quelle référence DLL de VBA, installée côté client, trouver
la fonction HTMLdecode (ou équivalent) qui me transforme les "&lt;" en "<",
entre autres ? Si je me souviens bien, cette fonction est native dans ASP ,
et elle est prévue dans Longhorn (voir URL ci dessous), mais ici je ne suis
pas côté serveur ...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp

J'ai bien fait une fonction à la main, mais c'est lent, pas propre, et je
découvre tous les jours de nouveaux codes &machin...

Merci,

Olivier

9 réponses

Avatar
François Picalausa
Bonjour/soir,

Je te conseille d'utiliser une référence Microsoft XML.
Voici un bout de code se basant sur Microsoft XML:

'Pour plus d'informations sur le DOM:
'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/dom_devguide_overview_2g
1j.asp
Dim Document As MSXML.DOMDocument
Set Document = New MSXML.DOMDocument

'Les opérations seront synchrones
Document.async = False

'on charge le document
If Document.Load("http://www.unsiteparmistantdautresurlenet.fr/test.xml")
Then
Dim NodeList As MSXML.IXMLDOMNodeList, i As Long

'Retrouve tous les noeux elementsuivant sous elemetentpremier contenant
au moins un element date
'Pour plus d'informations sur XPath:

'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/xpath_syntax1_0fjs.asp
Set NodeList Document.selectNodes("elemetentpremier/elementsuivant[date]")

'On a retrouvé des éléments
If Not NodeList Is Nothing Then
For i = 0 To ChildNodeList.length - 1
'Affiche la date contenue dans l'élément date
Debug.Print ChildNodeList(i).selectSingleNode("date").text
Next i
End If
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message de
news:btq108$1nn$
Cher Tous,

Je transfère des données XML de pages web vers une table d'une base
acc97. J'utilise les API de wininet.dll comme proposé dans:
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, les données XML ont cette tête là:



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42

Forcement, la chaine que j'obtients est non formattée avec les
caractères de codages habituels HTML, genre :
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
au lieu de:
<Date-std_year>2003</Date-std_year>

Question : dans quelle référence DLL de VBA, installée côté client,
trouver la fonction HTMLdecode (ou équivalent) qui me transforme les
"&lt;" en "<", entre autres ? Si je me souviens bien, cette fonction
est native dans ASP , et elle est prévue dans Longhorn (voir URL ci
dessous), mais ici je ne suis pas côté serveur ...




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp

J'ai bien fait une fonction à la main, mais c'est lent, pas propre,
et je découvre tous les jours de nouveaux codes &machin...

Merci,

Olivier


Avatar
Olivier Delrieu
Merci François, mais j'utilise déjà le genre de code que tu mentionne. Je
n'ai probablement pas été très clair dans mon premier mail. Je reprends :

Je capture une page web avec un code du genre (j'ai appellé la function
dumpURL):
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

la chaine de caractère que j'obtient (sDump) est de ce style :

<html>....
<body> ... blabla...
<pre>
...
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
...
</pre>
...blabla....
</body>
</html>

Les données XML sont entre les tags <pre>. Avant de traiter ces données avec
les fonction MSXML il faut absolument decoder les "&gt;" en >. J'ai crée une
fonction maison qui fait ça. Schématiquement, le code ressemble à :

sURL http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42
sDump = dumpUrl(sURL)
sDump = FonctionQuiExtraitLaChaineEntreLesTagsPre(sDump)
sDump = HTMLdecode(sDump)
domdoc.loadXML(sDump)
puis gestions des Nodes comme tu le propose, etc...

Je suis juste à la recherche d'une fonction HTMLdecode 'propre' et rapide,
probablement déjà proposé dans une référence dll.

Merci,

Olivier.


"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

Je te conseille d'utiliser une référence Microsoft XML.
Voici un bout de code se basant sur Microsoft XML:

'Pour plus d'informations sur le DOM:



'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/dom_devguide_overview_2g
1j.asp
Dim Document As MSXML.DOMDocument
Set Document = New MSXML.DOMDocument

'Les opérations seront synchrones
Document.async = False

'on charge le document
If Document.Load("http://www.unsiteparmistantdautresurlenet.fr/test.xml")
Then
Dim NodeList As MSXML.IXMLDOMNodeList, i As Long

'Retrouve tous les noeux elementsuivant sous elemetentpremier


contenant
au moins un element date
'Pour plus d'informations sur XPath:

'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/xpath_syntax1_0fjs.asp
Set NodeList > Document.selectNodes("elemetentpremier/elementsuivant[date]")

'On a retrouvé des éléments
If Not NodeList Is Nothing Then
For i = 0 To ChildNodeList.length - 1
'Affiche la date contenue dans l'élément date
Debug.Print ChildNodeList(i).selectSingleNode("date").text
Next i
End If
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message de
news:btq108$1nn$
> Cher Tous,
>
> Je transfère des données XML de pages web vers une table d'une base
> acc97. J'utilise les API de wininet.dll comme proposé dans:
> http://support.microsoft.com/default.aspx?scid=kb;en-us;232194
>
> Pour info, les données XML ont cette tête là:
>



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42
>
> Forcement, la chaine que j'obtients est non formattée avec les
> caractères de codages habituels HTML, genre :
> &lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
> au lieu de:
> <Date-std_year>2003</Date-std_year>
>
> Question : dans quelle référence DLL de VBA, installée côté client,
> trouver la fonction HTMLdecode (ou équivalent) qui me transforme les
> "&lt;" en "<", entre autres ? Si je me souviens bien, cette fonction
> est native dans ASP , et elle est prévue dans Longhorn (voir URL ci
> dessous), mais ici je ne suis pas côté serveur ...
>
>



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp
>
> J'ai bien fait une fonction à la main, mais c'est lent, pas propre,
> et je découvre tous les jours de nouveaux codes &machin...
>
> Merci,
>
> Olivier




Avatar
François Picalausa
Bonjour/soir,

Il est possible d'utiliser InternetExplorer comme ceci:
Option Explicit

Private WithEvents IEBrowser As InternetExplorer

Private Sub Command1_Click()
IEBrowser.Navigate
"http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML
&list_uidst42"
End Sub

Private Sub Form_Initialize()
Set IEBrowser = New InternetExplorer
End Sub

Private Sub Form_Terminate()
Set IEBrowser = Nothing
End Sub

Private Sub IEBrowser_DocumentComplete(ByVal pDisp As Object, URL As
Variant)
Dim XMLContent As String, PreElement As Object
Dim Document As DOMDocument

Set PreElement = IEBrowser.Document.getElementsByTagName("pre")(0)

If Not PreElement Is Nothing Then
XMLContent = PreElement.innerText

XMLContent = Replace$(XMLContent, "<!DOCTYPE Entrezgene PUBLIC
""-//NCBI//NCBI Entrezgene/EN"" ""NCBI_Entrezgene.dtd"">", "")
Set Document = New DOMDocument
Document.validateOnParse = False
MsgBox Document.loadXML(XMLContent)
MsgBox Document.parseError.reason
End If
End Sub

Tu trouveras aussi la table des caractères "spéciaux" ici:
http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset1.asp

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message de
news:btreg8$p6p$
Merci François, mais j'utilise déjà le genre de code que tu
mentionne. Je n'ai probablement pas été très clair dans mon premier
mail. Je reprends :

Je capture une page web avec un code du genre (j'ai appellé la
function dumpURL):
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

la chaine de caractère que j'obtient (sDump) est de ce style :

<html>....
<body> ... blabla...
<pre>
...
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
...
</pre>
...blabla....
</body>
</html>

Les données XML sont entre les tags <pre>. Avant de traiter ces
données avec les fonction MSXML il faut absolument decoder les "&gt;"
en >. J'ai crée une fonction maison qui fait ça. Schématiquement, le
code ressemble à :

sURL >


http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42
sDump = dumpUrl(sURL)
sDump = FonctionQuiExtraitLaChaineEntreLesTagsPre(sDump)
sDump = HTMLdecode(sDump)
domdoc.loadXML(sDump)
puis gestions des Nodes comme tu le propose, etc...

Je suis juste à la recherche d'une fonction HTMLdecode 'propre' et
rapide, probablement déjà proposé dans une référence dll.

Merci,

Olivier.


"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

Je te conseille d'utiliser une référence Microsoft XML.
Voici un bout de code se basant sur Microsoft XML:

'Pour plus d'informations sur le DOM:






'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/dom_devguide_overview_2g
1j.asp
Dim Document As MSXML.DOMDocument
Set Document = New MSXML.DOMDocument

'Les opérations seront synchrones
Document.async = False

'on charge le document
If
Document.Load("http://www.unsiteparmistantdautresurlenet.fr/test.xml")
Then Dim NodeList As MSXML.IXMLDOMNodeList, i As Long

'Retrouve tous les noeux elementsuivant sous elemetentpremier
contenant au moins un element date
'Pour plus d'informations sur XPath:






'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/xpath_syntax1_0fjs.asp
Set NodeList >> Document.selectNodes("elemetentpremier/elementsuivant[date]")

'On a retrouvé des éléments
If Not NodeList Is Nothing Then
For i = 0 To ChildNodeList.length - 1
'Affiche la date contenue dans l'élément date
Debug.Print
ChildNodeList(i).selectSingleNode("date").text Next i
End If
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message
de news:btq108$1nn$
Cher Tous,

Je transfère des données XML de pages web vers une table d'une base
acc97. J'utilise les API de wininet.dll comme proposé dans:
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, les données XML ont cette tête là:









http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42

Forcement, la chaine que j'obtients est non formattée avec les
caractères de codages habituels HTML, genre :
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
au lieu de:
<Date-std_year>2003</Date-std_year>

Question : dans quelle référence DLL de VBA, installée côté client,
trouver la fonction HTMLdecode (ou équivalent) qui me transforme les
"&lt;" en "<", entre autres ? Si je me souviens bien, cette fonction
est native dans ASP , et elle est prévue dans Longhorn (voir URL ci
dessous), mais ici je ne suis pas côté serveur ...










http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp

J'ai bien fait une fonction à la main, mais c'est lent, pas propre,
et je découvre tous les jours de nouveaux codes &machin...

Merci,

Olivier






Avatar
Olivier Delrieu
François,

Ok merci, ça me semble une très bonne alternative à l'usine à gaz que j'ai
pour l'instant... Cependant j'avais préféré utiliser les API de wininet.dll
pour récupérer la page, au vu des problèmes des versions VB5 ou VB6 non
patchés, mentionnés dans :
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, parmi les méthodes suivantes pour récupérer une page web,
pourrais tu me dire quel est la meilleure, quels sont les pour/contre :
- APIs de wininet
- INET activeX control
- object InternetExplorer de 'MS internet controls', comme tu propose

Tout ça dans un souci de compatibilité entre plusieurs versions : NT4/2K/XP
, Acc97/Acc2K ...

Merci encore,

Olivier


"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

Il est possible d'utiliser InternetExplorer comme ceci:
Option Explicit

Private WithEvents IEBrowser As InternetExplorer

Private Sub Command1_Click()
IEBrowser.Navigate



"http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML
&list_uidst42"
End Sub

Private Sub Form_Initialize()
Set IEBrowser = New InternetExplorer
End Sub

Private Sub Form_Terminate()
Set IEBrowser = Nothing
End Sub

Private Sub IEBrowser_DocumentComplete(ByVal pDisp As Object, URL As
Variant)
Dim XMLContent As String, PreElement As Object
Dim Document As DOMDocument

Set PreElement = IEBrowser.Document.getElementsByTagName("pre")(0)

If Not PreElement Is Nothing Then
XMLContent = PreElement.innerText

XMLContent = Replace$(XMLContent, "<!DOCTYPE Entrezgene PUBLIC
""-//NCBI//NCBI Entrezgene/EN"" ""NCBI_Entrezgene.dtd"">", "")
Set Document = New DOMDocument
Document.validateOnParse = False
MsgBox Document.loadXML(XMLContent)
MsgBox Document.parseError.reason
End If
End Sub

Tu trouveras aussi la table des caractères "spéciaux" ici:



http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset1.asp

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message de
news:btreg8$p6p$
> Merci François, mais j'utilise déjà le genre de code que tu
> mentionne. Je n'ai probablement pas été très clair dans mon premier
> mail. Je reprends :
>
> Je capture une page web avec un code du genre (j'ai appellé la
> function dumpURL):
> http://support.microsoft.com/default.aspx?scid=kb;en-us;232194
>
> la chaine de caractère que j'obtient (sDump) est de ce style :
>
> <html>....
> <body> ... blabla...
> <pre>
> ...
> &lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
> ...
> </pre>
> ...blabla....
> </body>
> </html>
>
> Les données XML sont entre les tags <pre>. Avant de traiter ces
> données avec les fonction MSXML il faut absolument decoder les "&gt;"
> en >. J'ai crée une fonction maison qui fait ça. Schématiquement, le
> code ressemble à :
>
> sURL > >



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42
> sDump = dumpUrl(sURL)
> sDump = FonctionQuiExtraitLaChaineEntreLesTagsPre(sDump)
> sDump = HTMLdecode(sDump)
> domdoc.loadXML(sDump)
> puis gestions des Nodes comme tu le propose, etc...
>
> Je suis juste à la recherche d'une fonction HTMLdecode 'propre' et
> rapide, probablement déjà proposé dans une référence dll.
>
> Merci,
>
> Olivier.
>
>
> "François Picalausa" a écrit dans le message de
> news:
>> Bonjour/soir,
>>
>> Je te conseille d'utiliser une référence Microsoft XML.
>> Voici un bout de code se basant sur Microsoft XML:
>>
>> 'Pour plus d'informations sur le DOM:
>>
>



'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/dom_devguide_overview_2g
>> 1j.asp
>> Dim Document As MSXML.DOMDocument
>> Set Document = New MSXML.DOMDocument
>>
>> 'Les opérations seront synchrones
>> Document.async = False
>>
>> 'on charge le document
>> If
>> Document.Load("http://www.unsiteparmistantdautresurlenet.fr/test.xml")
>> Then Dim NodeList As MSXML.IXMLDOMNodeList, i As Long
>>
>> 'Retrouve tous les noeux elementsuivant sous elemetentpremier
>> contenant au moins un element date
>> 'Pour plus d'informations sur XPath:
>>
>>
'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/xpath_syntax1_0fjs.asp
>> Set NodeList > >> Document.selectNodes("elemetentpremier/elementsuivant[date]")
>>
>> 'On a retrouvé des éléments
>> If Not NodeList Is Nothing Then
>> For i = 0 To ChildNodeList.length - 1
>> 'Affiche la date contenue dans l'élément date
>> Debug.Print
>> ChildNodeList(i).selectSingleNode("date").text Next i
>> End If
>> End If
>>
>> --
>> François Picalausa (MVP VB)
>> FAQ VB : http://faq.vb.free.fr
>> MSDN : http://msdn.microsoft.com
>>
>>
>> "Olivier Delrieu" a écrit dans le message
>> de news:btq108$1nn$
>>> Cher Tous,
>>>
>>> Je transfère des données XML de pages web vers une table d'une base
>>> acc97. J'utilise les API de wininet.dll comme proposé dans:
>>> http://support.microsoft.com/default.aspx?scid=kb;en-us;232194
>>>
>>> Pour info, les données XML ont cette tête là:
>>>
>>
>



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42
>>>
>>> Forcement, la chaine que j'obtients est non formattée avec les
>>> caractères de codages habituels HTML, genre :
>>> &lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
>>> au lieu de:
>>> <Date-std_year>2003</Date-std_year>
>>>
>>> Question : dans quelle référence DLL de VBA, installée côté client,
>>> trouver la fonction HTMLdecode (ou équivalent) qui me transforme les
>>> "&lt;" en "<", entre autres ? Si je me souviens bien, cette fonction
>>> est native dans ASP , et elle est prévue dans Longhorn (voir URL ci
>>> dessous), mais ici je ne suis pas côté serveur ...
>>>
>>>
>>
>



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp
>>>
>>> J'ai bien fait une fonction à la main, mais c'est lent, pas propre,
>>> et je découvre tous les jours de nouveaux codes &machin...
>>>
>>> Merci,
>>>
>>> Olivier




Avatar
François Picalausa
Bonjour/soir,

Pour info, parmi les méthodes suivantes pour récupérer une page web,
pourrais tu me dire quel est la meilleure, quels sont les pour/contre :
- APIs de wininet



Très bien comme APIs mais ça ne fait pas tous les traitements (&amp; > &,
...) tout seul...

- INET activeX control



Buggé
A n'utiliser qu'en cas de volonté de rompre la compatibilité avec une
machine sur deux ;-)

- object InternetExplorer de 'MS internet controls', comme tu propose



Fait le traitement seul mais il y a un problème d'invites de script...

Tout ça dans un souci de compatibilité entre plusieurs versions : NT4/2K/XP
, Acc97/Acc2K ...



IE est présent en version 4 depuis win95. C'est de l'automation, donc,
Access97 et + supportent ans problème.

En ce qui concerne les API Wininet:
InternetOpen, InternetOpenUrl, InternetReadFile, InternetCloseHandle
Client: Included in Windows XP, Windows 2000 Professional, Windows NT
Workstation 4.0, Windows Me, Windows 98, and Windows 95.
Server: Included in Windows Server 2003, Windows 2000 Server, and Windows NT
Server 4.0.

et sont supportées depuis que les API sont supportées en access ;-)

Une autre alternative est l'API URLDownloadToFile qui propose la même
compatibilité. (ou encore URLDownloadToCacheFile, pour éviter de devoir
trouver un endroit pour le fichier temporairer)

En utilisant simplement les API Wininet selon la fiche de la KB, voici
comment procéder:
'Mêmes déclarations dans un module séparé
Private Sub Command1_Click()
Dim hOpen As Long
Dim hOpenUrl As Long
Dim sUrl As String
Dim bDoLoop As Boolean
Dim bRet As Boolean
Dim sReadBuffer As String * 2048
Dim lNumberOfBytesRead As Long
Dim sBuffer As String
Dim PreStart As Long
Dim PreEnd As Long

sUrl "http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML
&list_uidst42"

hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG,
vbNullString, vbNullString, 0)
hOpenUrl = InternetOpenUrl(hOpen, sUrl, vbNullString, 0,
INTERNET_FLAG_RELOAD, 0)

bDoLoop = True
While bDoLoop
sReadBuffer = vbNullString
bRet = InternetReadFile(hOpenUrl, sReadBuffer, Len(sReadBuffer),
lNumberOfBytesRead)
sBuffer = sBuffer & Left$(sReadBuffer, lNumberOfBytesRead)
If Not CBool(lNumberOfBytesRead) Then bDoLoop = False
Wend


PreStart = InStr(1, sBuffer, "<pre>")
PreEnd = InStr(1, sBuffer, "</pre>")

If PreStart And PreEnd And PreEnd > PreStart Then
sBuffer = Mid$(sBuffer, PreStart, PreEnd - PreStart + 6)
End If

Dim Doc As MSXML.DOMDocument
Set Doc = New MSXML.DOMDocument
Doc.async = False

If Doc.loadXML(sBuffer) Then
sBuffer = Doc.firstChild.Text
MsgBox "XML : " & vbCrLf & "---------------" & _
vbCrLf & sBuffer
If Doc.loadXML(sBuffer) Then
MsgBox "Réussite de l'opération!"
Else
MsgBox Doc.parseError.reason
End If
Else
MsgBox Doc.parseError.reason
End If

If hOpenUrl <> 0 Then InternetCloseHandle (hOpenUrl)
If hOpen <> 0 Then InternetCloseHandle (hOpen)
End Sub

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message de
news:btrp19$sna$
François,

Ok merci, ça me semble une très bonne alternative à l'usine à gaz que
j'ai pour l'instant... Cependant j'avais préféré utiliser les API de
wininet.dll pour récupérer la page, au vu des problèmes des versions
VB5 ou VB6 non patchés, mentionnés dans :
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, parmi les méthodes suivantes pour récupérer une page web,
pourrais tu me dire quel est la meilleure, quels sont les pour/contre
:
- APIs de wininet
- INET activeX control
- object InternetExplorer de 'MS internet controls', comme tu propose

Tout ça dans un souci de compatibilité entre plusieurs versions :
NT4/2K/XP , Acc97/Acc2K ...

Merci encore,

Olivier


"François Picalausa" a écrit dans le message de
news:
Bonjour/soir,

Il est possible d'utiliser InternetExplorer comme ceci:
Option Explicit

Private WithEvents IEBrowser As InternetExplorer

Private Sub Command1_Click()
IEBrowser.Navigate






"http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML
&list_uidst42"
End Sub

Private Sub Form_Initialize()
Set IEBrowser = New InternetExplorer
End Sub

Private Sub Form_Terminate()
Set IEBrowser = Nothing
End Sub

Private Sub IEBrowser_DocumentComplete(ByVal pDisp As Object, URL As
Variant)
Dim XMLContent As String, PreElement As Object
Dim Document As DOMDocument

Set PreElement >> IEBrowser.Document.getElementsByTagName("pre")(0)

If Not PreElement Is Nothing Then
XMLContent = PreElement.innerText

XMLContent = Replace$(XMLContent, "<!DOCTYPE Entrezgene
PUBLIC ""-//NCBI//NCBI Entrezgene/EN"" ""NCBI_Entrezgene.dtd"">", "")
Set Document = New DOMDocument
Document.validateOnParse = False
MsgBox Document.loadXML(XMLContent)
MsgBox Document.parseError.reason
End If
End Sub

Tu trouveras aussi la table des caractères "spéciaux" ici:






http://msdn.microsoft.com/workshop/author/dhtml/reference/charsets/charset1.asp

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le message
de news:btreg8$p6p$
Merci François, mais j'utilise déjà le genre de code que tu
mentionne. Je n'ai probablement pas été très clair dans mon premier
mail. Je reprends :

Je capture une page web avec un code du genre (j'ai appellé la
function dumpURL):
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

la chaine de caractère que j'obtient (sDump) est de ce style :

<html>....
<body> ... blabla...
<pre>
...
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
...
</pre>
...blabla....
</body>
</html>

Les données XML sont entre les tags <pre>. Avant de traiter ces
données avec les fonction MSXML il faut absolument decoder les
"&gt;" en >. J'ai crée une fonction maison qui fait ça.
Schématiquement, le code ressemble à :

sURL >>>








http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42
sDump = dumpUrl(sURL)
sDump = FonctionQuiExtraitLaChaineEntreLesTagsPre(sDump)
sDump = HTMLdecode(sDump)
domdoc.loadXML(sDump)
puis gestions des Nodes comme tu le propose, etc...

Je suis juste à la recherche d'une fonction HTMLdecode 'propre' et
rapide, probablement déjà proposé dans une référence dll.

Merci,

Olivier.


"François Picalausa" a écrit dans le message
de news:
Bonjour/soir,

Je te conseille d'utiliser une référence Microsoft XML.
Voici un bout de code se basant sur Microsoft XML:

'Pour plus d'informations sur le DOM:












'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/dom_devguide_overview_2g
1j.asp
Dim Document As MSXML.DOMDocument
Set Document = New MSXML.DOMDocument

'Les opérations seront synchrones
Document.async = False

'on charge le document
If
Document.Load("http://www.unsiteparmistantdautresurlenet.fr/test.xml")
Then Dim NodeList As MSXML.IXMLDOMNodeList, i As Long

'Retrouve tous les noeux elementsuivant sous elemetentpremier
contenant au moins un element date
'Pour plus d'informations sur XPath:











'http://msdn.microsoft.com/library/en-us/xmlsdk/htm/xpath_syntax1_0fjs.asp
Set NodeList >>>> Document.selectNodes("elemetentpremier/elementsuivant[date]")

'On a retrouvé des éléments
If Not NodeList Is Nothing Then
For i = 0 To ChildNodeList.length - 1
'Affiche la date contenue dans l'élément date
Debug.Print
ChildNodeList(i).selectSingleNode("date").text Next i
End If
End If

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com


"Olivier Delrieu" a écrit dans le
message de news:btq108$1nn$
Cher Tous,

Je transfère des données XML de pages web vers une table d'une
base acc97. J'utilise les API de wininet.dll comme proposé dans:
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, les données XML ont cette tête là:















http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&list_uidst42

Forcement, la chaine que j'obtients est non formattée avec les
caractères de codages habituels HTML, genre :
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
au lieu de:
<Date-std_year>2003</Date-std_year>

Question : dans quelle référence DLL de VBA, installée côté
client, trouver la fonction HTMLdecode (ou équivalent) qui me
transforme les "&lt;" en "<", entre autres ? Si je me souviens
bien, cette fonction est native dans ASP , et elle est prévue
dans Longhorn (voir URL ci dessous), mais ici je ne suis pas côté
serveur ...
















http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp

J'ai bien fait une fonction à la main, mais c'est lent, pas
propre, et je découvre tous les jours de nouveaux codes &machin...

Merci,

Olivier










Avatar
ng
Salut,

Sinon pour récupérer ta page, pourquoi pas utiliser URLDownloadToFile, ca
fonctionne très bien comme API ;-)

Il te suffirait alors de faire tes découpages (pour récupérer ce qu'il y a
entre <pre></pre>) avec les fonctions de string implantées dans vb( instr,
right, left, mid, instrrev...) puis d'utiliser simplement replace() pour
faire tes remplacements (les &gt; et alt; devraient suffir pour procéder au
parsing...)

Enfin tu fais ton parsing avec ce que tu veux, mais s'il s'agit de petits
fichier, pourquoi ne pas écrire une petite classe sous VB ? :-)

Ca allégerait les dépendances.

--
Nicolas.
http://www.ngsoft-fr.com




"Olivier Delrieu" a écrit dans le message de
news: btq108$1nn$
Cher Tous,

Je transfère des données XML de pages web vers une table d'une base acc97.
J'utilise les API de wininet.dll comme proposé dans:
http://support.microsoft.com/default.aspx?scid=kb;en-us;232194

Pour info, les données XML ont cette tête là:



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&
list_uidst42

Forcement, la chaine que j'obtients est non formattée avec les caractères


de
codages habituels HTML, genre :
&lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
au lieu de:
<Date-std_year>2003</Date-std_year>

Question : dans quelle référence DLL de VBA, installée côté client,


trouver
la fonction HTMLdecode (ou équivalent) qui me transforme les "&lt;" en


"<",
entre autres ? Si je me souviens bien, cette fonction est native dans ASP


,
et elle est prévue dans Longhorn (voir URL ci dessous), mais ici je ne


suis
pas côté serveur ...




http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp

J'ai bien fait une fonction à la main, mais c'est lent, pas propre, et je
découvre tous les jours de nouveaux codes &machin...

Merci,

Olivier





Avatar
Olivier Delrieu
Merci Nicolas !

Je ne t'ai pas dis que cette base va fonctionner sur plusieurs type de
postes : NT/2K/XPp avec Acc97/2K ... donc je ne suis pas sûr que
URLDownloadToFile, instrrev et replace soient installés partout ... d'où le
retour à de 'vielles' API ... qu'en penses tu ??

L'option proposée par François d'utiliser l'object InternetExplorer me
semble pas mal, mais je suis pas sûr que cela fonctionne partout : il faut
que je teste. Qu'en dis tu ?

Pour info, je viens de m'appercevoir qu'il n'y a que 5 codes à gérer (merci
pour ta remarque : ça à fait tilt !):
< > ' " &
comme décrit dans :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/xsl_fund_127o.asp
(paragraphe 'Use fewer named entities')
Donc moins de soucis en perspective !!

Enfin, les pages font jusqu'à 500Ko avec plus de tags XML que de texte,
elles se parsent très bien avec les objects du type MSXML2.DOMDocument.

a+

Olivier

"ng" a écrit dans le message de
news:
Salut,

Sinon pour récupérer ta page, pourquoi pas utiliser URLDownloadToFile, ca
fonctionne très bien comme API ;-)

Il te suffirait alors de faire tes découpages (pour récupérer ce qu'il y a
entre <pre></pre>) avec les fonctions de string implantées dans vb( instr,
right, left, mid, instrrev...) puis d'utiliser simplement replace() pour
faire tes remplacements (les &gt; et alt; devraient suffir pour procéder


au
parsing...)

Enfin tu fais ton parsing avec ce que tu veux, mais s'il s'agit de petits
fichier, pourquoi ne pas écrire une petite classe sous VB ? :-)

Ca allégerait les dépendances.

--
Nicolas.
http://www.ngsoft-fr.com




"Olivier Delrieu" a écrit dans le message de
news: btq108$1nn$
> Cher Tous,
>
> Je transfère des données XML de pages web vers une table d'une base


acc97.
> J'utilise les API de wininet.dll comme proposé dans:
> http://support.microsoft.com/default.aspx?scid=kb;en-us;232194
>
> Pour info, les données XML ont cette tête là:
>



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&
list_uidst42
>
> Forcement, la chaine que j'obtients est non formattée avec les


caractères
de
> codages habituels HTML, genre :
> &lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
> au lieu de:
> <Date-std_year>2003</Date-std_year>
>
> Question : dans quelle référence DLL de VBA, installée côté client,
trouver
> la fonction HTMLdecode (ou équivalent) qui me transforme les "&lt;" en
"<",
> entre autres ? Si je me souviens bien, cette fonction est native dans


ASP
,
> et elle est prévue dans Longhorn (voir URL ci dessous), mais ici je ne
suis
> pas côté serveur ...
>
>



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp
>
> J'ai bien fait une fonction à la main, mais c'est lent, pas propre, et


je
> découvre tous les jours de nouveaux codes &machin...
>
> Merci,
>
> Olivier
>
>
>




Avatar
ng
Salut,

Je ne t'ai pas dis que cette base va fonctionner sur plusieurs type de
postes : NT/2K/XPp avec Acc97/2K ... donc je ne suis pas sûr que
URLDownloadToFile, instrrev et replace soient installés partout ... d'où


le
retour à de 'vielles' API ... qu'en penses tu ??


Dans ce cas il faudrait simplement recoder les fonctions manquantes, avec un
nom différent, exemple : Replace2 en utilisant mid, right, left, instr qui
sont implantées partout.

L'option proposée par François d'utiliser l'object InternetExplorer me
semble pas mal, mais je suis pas sûr que cela fonctionne partout : il faut
que je teste. Qu'en dis tu ?


En effet c'est une bonne astuce, et normalement cela fonctionne partout où
il y a IE d'installé.

Pour info, je viens de m'appercevoir qu'il n'y a que 5 codes à gérer


(merci
pour ta remarque : ça à fait tilt !):
< > ' " &
comme décrit dans :



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/
xsl_fund_127o.asp
(paragraphe 'Use fewer named entities')
Donc moins de soucis en perspective !!

Enfin, les pages font jusqu'à 500Ko avec plus de tags XML que de texte,
elles se parsent très bien avec les objects du type MSXML2.DOMDocument.


Ok ;-)

--
Nicolas.
http://www.ngsoft-fr.com
"Olivier Delrieu" a écrit dans le message de
news: bts9ed$bih$
Merci Nicolas !

Je ne t'ai pas dis que cette base va fonctionner sur plusieurs type de
postes : NT/2K/XPp avec Acc97/2K ... donc je ne suis pas sûr que
URLDownloadToFile, instrrev et replace soient installés partout ... d'où


le
retour à de 'vielles' API ... qu'en penses tu ??

L'option proposée par François d'utiliser l'object InternetExplorer me
semble pas mal, mais je suis pas sûr que cela fonctionne partout : il faut
que je teste. Qu'en dis tu ?

Pour info, je viens de m'appercevoir qu'il n'y a que 5 codes à gérer


(merci
pour ta remarque : ça à fait tilt !):
< > ' " &
comme décrit dans :



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/htm/
xsl_fund_127o.asp
(paragraphe 'Use fewer named entities')
Donc moins de soucis en perspective !!

Enfin, les pages font jusqu'à 500Ko avec plus de tags XML que de texte,
elles se parsent très bien avec les objects du type MSXML2.DOMDocument.

a+

Olivier

"ng" a écrit dans le message de
news:
> Salut,
>
> Sinon pour récupérer ta page, pourquoi pas utiliser URLDownloadToFile,


ca
> fonctionne très bien comme API ;-)
>
> Il te suffirait alors de faire tes découpages (pour récupérer ce qu'il y


a
> entre <pre></pre>) avec les fonctions de string implantées dans vb(


instr,
> right, left, mid, instrrev...) puis d'utiliser simplement replace() pour
> faire tes remplacements (les &gt; et alt; devraient suffir pour procéder
au
> parsing...)
>
> Enfin tu fais ton parsing avec ce que tu veux, mais s'il s'agit de


petits
> fichier, pourquoi ne pas écrire une petite classe sous VB ? :-)
>
> Ca allégerait les dépendances.
>
> --
> Nicolas.
> http://www.ngsoft-fr.com
>
>
>
>
> "Olivier Delrieu" a écrit dans le message de
> news: btq108$1nn$
> > Cher Tous,
> >
> > Je transfère des données XML de pages web vers une table d'une base
acc97.
> > J'utilise les API de wininet.dll comme proposé dans:
> > http://support.microsoft.com/default.aspx?scid=kb;en-us;232194
> >
> > Pour info, les données XML ont cette tête là:
> >
>



http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=gene&cmd=Retrieve&dopt=XML&
> list_uidst42
> >
> > Forcement, la chaine que j'obtients est non formattée avec les
caractères
> de
> > codages habituels HTML, genre :
> > &lt;Date-std_year&gt;2003&lt;/Date-std_year&gt;
> > au lieu de:
> > <Date-std_year>2003</Date-std_year>
> >
> > Question : dans quelle référence DLL de VBA, installée côté client,
> trouver
> > la fonction HTMLdecode (ou équivalent) qui me transforme les "&lt;" en
> "<",
> > entre autres ? Si je me souviens bien, cette fonction est native dans
ASP
> ,
> > et elle est prévue dans Longhorn (voir URL ci dessous), mais ici je ne
> suis
> > pas côté serveur ...
> >
> >
>



http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/
> frlrfsystemwebhttpserverutilityclasshtmldecodetopic.asp
> >
> > J'ai bien fait une fonction à la main, mais c'est lent, pas propre, et
je
> > découvre tous les jours de nouveaux codes &machin...
> >
> > Merci,
> >
> > Olivier
> >
> >
> >
>
>




Avatar
François Picalausa
Bonjour/soir,
"ng" a écrit dans le message de
news:%23pedu$
Je ne t'ai pas dis que cette base va fonctionner sur plusieurs type
de postes : NT/2K/XPp avec Acc97/2K ... donc je ne suis pas sûr que
URLDownloadToFile, instrrev et replace soient installés partout ...
d'où le retour à de 'vielles' API ... qu'en penses tu ??





en ce qui concerne URLDownloadToFile.
Je disais dans mon post précédent:
"Une autre alternative est l'API URLDownloadToFile qui propose la même
compatibilité [que les api utilisée actuellement]"

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com