コンテンツの制御

HtmlDocument

プロパティ

プロパティ 内容
object DomDocument このオブジェクトへのアンマネージドのポインタ
HtmlElementCollection All ドキュメントのすべてのHtmlElement
HtmlElementCollection Images ドキュメントのすべてのimg要素
HtmlElementCollection Forms ドキュメントのすべてのform要素
HtmlElementCollection Links ドキュメントのすべてのa、link、are要素
HtmlElement Body ドキュメントのbody要素
HtmlWindow Window ドキュメントのウィンドウ
Uri Url ドキュメントのURL
string Cookie ドキュメントに関連付けられているHTTPクッキー
string DefaultEncoding ドキュメントの既定のエンコーディング
string Encoding ドキュメントのエンコーディング
   
プロパティ - HtmlDocument クラス (System.Windows.Forms) | MSDN

DomDocument

アンマネージドのポインタを取得することで、HtmlDocumentに実装されていないメンバを利用できます。HtmlDocument.DomDocument プロパティ (System.Windows.Forms) | MSDN

mshtml.IHTMLDocument2 htmlDocument2
    = (mshtml.IHTMLDocument2)webBrowser.Document.DomDocument;

IHTMLDocument2を利用するには、それが宣言されているMicrosoft HTML Object Library (Microsoft.mshtml) を参照に追加する必要があります。これはソリューション エクスプローラーで[参照の追加]を選択し、[COM]の項目で"html"などをキーワードに検索することで見つけられます。c# - Using mshtml doesn't work - Stack Overflow

All

ドキュメント内のすべてのHtmlElementを取得できます。HtmlDocument.All プロパティ (System.Windows.Forms) | MSDN

webBrowser.DocumentCompleted += delegate
{
    HtmlElementCollection all = webBrowser.Document.All;
    int count = all.Count; // 4

    string html0 = all[0].OuterHtml; // "<HTML><HEAD></HEAD>\r\n<BODY></BODY></HTML>"
    string html1 = all[1].OuterHtml; // "<HEAD></HEAD>"
    string html2 = all[2].OuterHtml; // null
    string html3 = all[3].OuterHtml; // "\r\n<BODY></BODY>"

    string tag0 = all[0].TagName; // "HTML"
    string tag1 = all[1].TagName; // "HEAD"
    string tag2 = all[2].TagName; // "TITLE"
    string tag3 = all[3].TagName; // "BODY"
};
webBrowser.Navigate("about:blank");

メソッド

戻り値の型 メソッド 機能
HtmlElement GetElementById(String) 指定のIDを持つ、1つの要素を得る
HtmlElement GetElementFromPoint(Point) 指定のクライアント座標にある、1つの要素を得る
HtmlElementCollection GetElementsByTagName(String) 指定のタグを持つ、要素のコレクションを得る
メソッド - HtmlDocument クラス (System.Windows.Forms) | MSDN

CreateElement()

要素を作成できます。

public HtmlElement CreateElement(
    string elementTag // 作成するHTML要素の名前
)
HtmlDocument.CreateElement メソッド (String) (System.Windows.Forms) | MSDN

HtmlElement

プロパティ

プロパティ 内容
object DomElement このオブジェクトへのアンマネージドのポインタ
string Id 要素のid属性
string Name 要素のname属性
HtmlElement Parent 親要素
HtmlElement NextSibling 次の要素
HtmlElement OffsetParent OffsetRectangleの基準となる要素
Rectangle OffsetRectangle 要素のクライアント領域
Rectangle ClientRectangle 要素のクライアント領域から、borderとスクロールバーの大きさを除いた大きさ
Rectangle ScrollRectangle 要素がスクロールできる領域の大きさとその座標
int ScrollLeft ScrollRectangle.Xへの参照
int ScrollTop ScrollRectangle.Yへの参照
プロパティ - HtmlElement クラス (System.Windows.Forms) | MSDN

DomElement

アンマネージドのポインタが返されるため、それを通してHtmlElementに実装されていないメンバを利用できるようになります。HtmlElement.DomElement プロパティ (System.Windows.Forms) | MSDN

HtmlDocument document = webBrowser.Document;
mshtml.IHTMLDocument3 htmlDocument3 = (mshtml.IHTMLDocument3)document.DomDocument;


HtmlElement element = document.CreateElement("p");

mshtml.IHTMLDOMNode pElem = (mshtml.IHTMLDOMNode)element.DomElement;
mshtml.IHTMLDOMNode text = htmlDocument3.createTextNode("ABC");
pElem.appendChild(text);

document.Body.AppendChild(element);

string html = document.Body.InnerHtml; // "<P>ABC</P>"

メソッド

  メソッド 機能
  ScrollIntoView(Boolean) 要素が含まれるドキュメントをスクロールする
  SetAttribute(String, String) 属性の値を設定
  GetAttribute(String) 属性の値を取得
  GetElementsByTagName(String) 指定のタグを持つ、要素のコレクションを得る
メソッド - HtmlElement クラス (System.Windows.Forms) | MSDN

SetAttribute()

属性を設定できます。

public void SetAttribute(
    string attributeName, // 設定する属性の名前
    string value          // 設定する属性の値
)
HtmlElement.SetAttribute メソッド (String, String) (System.Windows.Forms) | MSDN

イベントハンドラは、AttachEventHandler()で設定します。

attributeNameでは、大文字/小文字は区別されません。

element.SetAttribute("foo", "123");
string a = element.GetAttribute("FOO"); // 123が返される
HtmlElement.GetAttribute メソッド (String) (System.Windows.Forms) | MSDN

原則的に属性名はHTMLのそれの通りに記述しますが、class属性は"className"とします。これはJavaScriptでの命名規則と同じです。

element.SetAttribute("className", "newValue");

id属性とname属性にはこのメソッドを用いる必要はなく、プロパティから設定できます。

element.Id = "abc";
img要素のsrc属性

画像を直接読み込ませるならば、そのファイルのパスを指定します。

HtmlElement img = document.CreateElement("img");
img.SetAttribute("src", "sample.gif");

画像をコードに含めるならば、それをBase64エンコードしておきdata URIで指定します。

string base64String = "iVBORw0KGgoAAAANSUhE…";

HtmlElement img = document.CreateElement("img");
img.SetAttribute("src", "data:image/bmp;base64," + base64String);

画像をリソースで管理するならば、それをBase64エンコードしてdata URIで指定します。

Bitmap bitmap = Test.Properties.Resources.sample;

ImageConverter imageConverter = new ImageConverter();
byte[] bytes = (byte[])imageConverter.ConvertTo(bitmap, typeof(byte[]));
string base64String = Convert.ToBase64String(bytes);

HtmlElement img = document.CreateElement("img");
img.SetAttribute("src", "data:image/bmp;base64," + base64String);

ScrollIntoView()

要素を含むドキュメントをスクロールできます。

public void ScrollIntoView(
    bool alignWithTop
)
HtmlElement.ScrollIntoView メソッド (Boolean) (System.Windows.Forms) | MSDN

alignWithTopによって、要素がスクロールされる位置が異なります。

  • true … 要素の左上端が、ドキュメントの左上端
  • false … 要素の左下端が、ドキュメントの左下端 (右下ではない)

このメソッドによって移動するのは要素を含むドキュメントであって、要素自身ではありません。つまり変化するのはelement.Parent.ScrollRectangleであって、element.ScrollRectangleではありません。

スクロール位置を細かく制御するならば、このメソッドを用いず親要素のScrollTopやScrollLeftに値を設定します。

HtmlElement parent = element.OffsetParent;
parent.ScrollTop = element.OffsetRectangle.Top - parent.OffsetRectangle.Top;

JavaScriptでの要素を含むドキュメントのスクロール

イベント

イベント 発生タイミング
Click 要素がクリックされたとき
DoubleClick 要素がダブルクリックされたとき
Drag テキストがドラッグされたとき
DragEnd ドラッグが終了したとき
   
イベント - HtmlElement クラス (System.Windows.Forms) | MSDN

上記以外のイベントは、AttachEventHandler()で捕捉できます。

HtmlElementEventArgs

DOMの制御

要素の取得

HtmlElementの2つのプロパティで、それぞれ以下の範囲の要素を取得できます。

webBrowser.DocumentCompleted += delegate
{
    HtmlElement body = webBrowser.Document.Body;

    {
        HtmlElementCollection elems = body.All;
        int count = elems.Count; // 2

        string html0 = elems[0].OuterHtml; // "\r\n<DIV><P>AA</P>BB</DIV>"
        string html1 = elems[1].OuterHtml; // "\r\n<P>AA</P>"

        string tag0  = elems[0].TagName;   // "DIV"
        string tag1  = elems[1].TagName;   // "P"
    }

    {
        HtmlElementCollection elems = body.Children;
        int count = elems.Count; // 1

        string html0 = elems[0].OuterHtml; // "\r\n<DIV><P>AA</P>BB</DIV>"
        string tag0  = elems[0].TagName;   // "DIV"
    }
};
webBrowser.DocumentText = "<HTML><BODY><DIV><P>AA</P>BB</DIV></BODY></HTML>";

AllやChildrenプロパティから得られるHtmlElementには、テキストノードが含まれません。もしテキストもノードとして取得する必要があるならば、DomDocumentを介してIHTMLDOMNodeオブジェクトを取得し、それのnodeTypeプロパティが3となるノードを探します。dom - How can I retreive all the text nodes of a HTMLDocument in the fastest way in C#? - Stack Overflow

webBrowser.DocumentCompleted += delegate
{
    mshtml.IHTMLDocument2 htmlDocument = (mshtml.IHTMLDocument2)webBrowser.Document.DomDocument;
    mshtml.IHTMLDOMNode body = (mshtml.IHTMLDOMNode)htmlDocument.body;
    int length1 = body.childNodes.length; // 1

    mshtml.IHTMLDOMNode div = body.childNodes[0];
    string name1  = div.nodeName;  // "DIV"
    int    type1  = div.nodeType;  // 1
    var    value1 = div.nodeValue; // {}


    int length2 = div.childNodes.length; // 2

    mshtml.IHTMLDOMNode p = div.childNodes[0];
    string name2  = p.nodeName;  // "P"
    int    type2  = p.nodeType;  // 1
    var    value2 = p.nodeValue; // {}

    mshtml.IHTMLDOMNode text = div.childNodes[1];
    string name3  = text.nodeName;  // "#text"
    int    type3  = text.nodeType;  // 3
    var    value3 = text.nodeValue; // "BB"
};
webBrowser.DocumentText = "<HTML><BODY><DIV><P>AA</P>BB</DIV></BODY></HTML>";

子要素の削除

簡単には、要素のInnerHtmlプロパティにnullを設定することで、その内容を削除できます。

webBrowser.Document.Body.InnerHtml = null;

またはDomDocumentを介してIHTMLDOMNodeオブジェクトを取得し、そのremoveChild()から削除します。

HtmlDocument document = webBrowser.Document;

mshtml.IHTMLDocument2 htmlDocument = (mshtml.IHTMLDocument2)document.DomDocument;
mshtml.IHTMLElement body = htmlDocument.body;
mshtml.IHTMLDOMNode node = (mshtml.IHTMLDOMNode)body;

while(node.hasChildNodes())
{
    node.removeChild(node.firstChild);
}
IHTMLDOMNode retVal = object.removeChild(oldChild);
removeChild method (Windows) | MSDN
Microsoft Learnから検索