2012-04-03 15 views
4

Ich möchte die MSHTML-Bibliothek verwenden, um einige HTML zu analysieren, die ich in einer Zeichenfolge-Variable habe. Ich kann jedoch nicht herausfinden, wie das geht. Ich kann den Inhalt einer Webseite mit einer bekannten URL, aber nicht direkt mit der Quell-HTML direkt analysieren. Ist das möglich? Wenn das so ist, wie?MSHTML: CreateDocumentFromString anstelle von 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' 
    .... 

Antwort

11

Sie können;

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

Nice! Hinweis für andere: Ich habe einen Kompilierfehler in VBA erhalten, als ich versuchte, 'Odoc As HTMLDocument' zu deklarieren: * Kompilierfehler: Funktion oder Schnittstelle als eingeschränkt markiert, oder die Funktion verwendet einen Automatisierungstyp, der in Visual Basic * nicht unterstützt wird. Die Änderung der Deklaration zu 'Odoc As Object' (wie diese Antwort deutlich zeigt) behob das Problem. – mwolfe02

+0

Ja, ich stimme zu, schön ist das Wort. – Fionnuala

+0

@Alex: Ich hoffe, es macht Ihnen nichts aus, aber ich habe Ihre Antwort so bearbeitet, dass sie eine Möglichkeit enthält, die Bibliothek spät zu sperren. Es ist nicht naheliegend und hat mir etwas Zeit genommen, über das Internet zu finden. – mwolfe02

1

Dies ist ein viel besseres Beispiel. Sie erhalten weder eine Null-Ausnahme noch eine späte Bindung.

(Und wenn Sie WPF verwenden, fügen Sie einfach System.Windows.Forms in Ihre Referenz.)

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

nicht vb6, vba, dies ist vb .net denke ich. –

0

Für gerade HTML-Code wie Access-Rich-Text-dies tut es:

Dim HTMLDoc As New HTMLDocument 

HTMLDoc.Body.innerHTML = strHTMLText