C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: HtmlDocumentにHTMLを入れたい


(過去ログ 81 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■48317 / inTopicNo.1)  HtmlDocumentにHTMLを入れたい
  
□投稿者/ Tamori (1回)-(2010/04/01(Thu) 17:02:40)

分類:[.NET 全般] 

HtmlDocumentにWebRequestとWebResponseで取得したHTMLソースを入れたいのですが、
方法はあるでしょうか?
mshtml.HTMLDocumentでもかまいません。
お願いいします。

引用返信 編集キー/
■48318 / inTopicNo.2)  Re[1]: HtmlDocumentにHTMLを入れたい
□投稿者/ 魔界の仮面弁士 (1593回)-(2010/04/01(Thu) 17:37:17)
No48317 (Tamori さん) に返信
> HtmlDocumentにWebRequestとWebResponseで取得したHTMLソースを入れたいのですが、
> 方法はあるでしょうか?
> mshtml.HTMLDocumentでもかまいません。

System.Runtime.InteropServices.ComTypes.IPersistFile インターフェイス、
もしくは IPersistStreamInit インターフェイスを使ってみてください。


IPersistFile はファイルからの生成で、IPersistStreamInit はストリームです。

    Dim doc As New mshtml.HTMLDocument()
    Dim f As IPersistFile = DirectCast(doc, IPersistFile)
    f.Load("c:\test.html", 0)

    'loading => interactive => complete
    Do Until doc.readyState = "complete"
        Application.DoEvents()
    Loop

    MsgBox(doc.documentElement.outerHTML)

引用返信 編集キー/
■48320 / inTopicNo.3)  Re[2]: HtmlDocumentにHTMLを入れたい
□投稿者/ 魔界の仮面弁士 (1594回)-(2010/04/01(Thu) 18:42:36)
No48318 (魔界の仮面弁士) に追記
> System.Runtime.InteropServices.ComTypes.IPersistFile インターフェイス、
> もしくは IPersistStreamInit インターフェイスを使ってみてください。

今度は IPersistStreamInit 版です。下記では Interface 定義から書いていますが、
Microsoft.BizTalk.Component.Interop.IPersistStreamInit や
Microsoft.VisualStudio.OLE.Interop.IPersistStreamInit のアセンブリがある場合は、
それらを利用できるかも知れません。


HttpWebResponse.GetResponseStream() を IPersistStreamInit に変換する際に、
 1. ADODB.Stream に転写
 2. ADODB.Stream を System.Runtime.InteropServices.ComTypes.IStream にキャスト
 3. IPersistStreamInit.Load(IStream) で読み込み
という流れで処理していますが……もっとスマートな方法があるのかも。


Option Strict On
Imports System.Net
Imports System.Runtime.InteropServices
Imports System.Runtime.InteropServices.ComTypes

Public Class Form1

    <ComImport(), _
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown), _
     Guid("7FD52380-4E07-101B-AE2D-08002B2EC713")> _
    Public Interface IPersistStreamInit
        Sub GetClassID(<Out()> ByRef pClassID As Guid)
        <PreserveSig()> Function IsDirty() As Integer
        Sub Load(<[In](), MarshalAs(UnmanagedType.Interface)> _
                 ByVal pstm As IStream)
        Sub Save(<[In](), MarshalAs(UnmanagedType.Interface)> _
                 ByVal pstm As IStream, _
                 <[In](), MarshalAs(UnmanagedType.Bool)> _
                 ByVal fClearDirty As Boolean)
        Sub GetSizeMax(<Out(), MarshalAs(UnmanagedType.LPArray)> _
                       ByVal pcbSize As Long)
        Sub InitNew()
    End Interface

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        Dim req As WebRequest = WebRequest.Create("http://www.google.co.jp/")

        Dim istm As IStream
        Using res As WebResponse = req.GetResponse(), _
              stm As System.IO.Stream = res.GetResponseStream()
            Dim aStm As New ADODB.Stream()
            aStm.Type = ADODB.StreamTypeEnum.adTypeBinary
            aStm.Open()
            Dim count As Integer = 0
            Do
                Dim buf(1023) As Byte
                count = stm.Read(buf, 0, buf.Length)
                If count < buf.Length Then
                    ReDim Preserve buf(count - 1)
                End If
                aStm.Write(buf)
            Loop Until count = 0
            aStm.Flush()
            aStm.Position = 0
            istm = DirectCast(aStm, IStream)
        End Using

        Dim doc As New mshtml.HTMLDocument()
        Dim ps As IPersistStreamInit = DirectCast(doc, IPersistStreamInit)
        ps.InitNew()
        ps.Load(istm)

        '( uninitialized => ) loading => interactive => complete
        Do Until doc.readyState = "complete"
            Application.DoEvents()
        Loop

        MsgBox(doc.documentElement.outerHTML)
    End Sub
End Class

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -