2012-04-03 1 views
4

Je voudrais utiliser la bibliothèque MSHTML pour analyser du code HTML que j'ai dans une variable de chaîne. Cependant, je ne peux pas comprendre comment faire cela. Je peux facilement analyser le contenu d'une page Web avec une URL connue, mais pas directement avec le code source HTML. Est-ce possible? Si c'est le cas, comment?MSHTML: CreateDocumentFromString au lieu de CreateDocumentFromUrl

Public Sub ParseHTML(sHTML As String) 
Dim oHTML As New HTMLDocument, oDoc As HTMLDocument 

    'This works:' 
    Set oDoc = oHTML.createDocumentFromUrl("http://www.google.com", "") 

    'I would like to do the following but no such method actually exists:' 
    Set oDoc = oHTML.createDocumentFromString(sHTML) 

    .... 
    'Parse the HTML using the oDoc variable' 
    .... 

Répondre

11

Vous pouvez;

Dim odoc As Object 

Set odoc = CreateObject("htmlfile") '// late binding 

'// or: 
'// Set odoc = New HTMLDocument 
'// for early binding 

odoc.open 
odoc.write "<p> In his house at R'lyeh, dead <b>Cthulhu</b> waits dreaming</p>" 
odoc.Close 
MsgBox odoc.body.outerHTML 
+4

de Nice! Note aux autres: J'ai reçu une erreur de compilation dans VBA quand j'ai essayé de déclarer 'odoc As HTMLDocument': * Erreur de compilation: Fonction ou interface marquée comme restreinte, ou la fonction utilise un type Automation non supporté dans Visual Basic *. Changer la déclaration en 'odoc As Object' (comme le montre clairement cette réponse) a résolu le problème. – mwolfe02

+0

Oui, je suis d'accord, c'est bien le mot. – Fionnuala

+0

@Alex: J'espère que cela ne vous dérange pas, mais j'ai édité votre réponse pour inclure un moyen de renvoyer la bibliothèque en retard. Ce n'est pas évident et cela m'a pris du temps pour trouver via le web. – mwolfe02

1

Ceci est un bien meilleur exemple. Vous ne recevrez pas d'exception nulle, ni de liaison tardive.

(Et si vous utilisez WPF, il suffit d'ajouter System.Windows.Forms dans votre référence.)

Dim a As Object 
     a = New mshtml.HTMLDocument 

     a.open() 
     a.writeln(code) 
     a.close() 

     Do Until a.readyState = "complete" 
      System.Windows.Forms.Application.DoEvents() 
     Loop 


     Dim doc As mshtml.HTMLDocument = a 



     Dim b As mshtml.HTMLSelectElement = doc.getElementsByTagName("Select").item("lang", 0) 
+0

pas vb6, vba, ceci est vb .net je pense. –

0

Pour le code HTML directement comme Access-Rich-Text ce fait il:

Dim HTMLDoc As New HTMLDocument 

HTMLDoc.Body.innerHTML = strHTMLText