| 型 | プロパティ | 内容 |
|---|---|---|
| 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に実装されていないメンバを利用できます。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
ドキュメント内のすべての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) | 指定のタグを持つ、要素のコレクションを得る |
要素を作成できます。
public HtmlElement CreateElement( string elementTag // 作成するHTML要素の名前 )HtmlDocument.CreateElement メソッド (String) (System.Windows.Forms) | MSDN
| 型 | プロパティ | 内容 |
|---|---|---|
| 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に実装されていないメンバを利用できるようになります。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) | 指定のタグを持つ、要素のコレクションを得る |
属性を設定できます。
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";
画像を直接読み込ませるならば、そのファイルのパスを指定します。
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);
要素を含むドキュメントをスクロールできます。
public void ScrollIntoView(
bool alignWithTop
)
HtmlElement.ScrollIntoView メソッド (Boolean) (System.Windows.Forms) | MSDN
alignWithTopによって、要素がスクロールされる位置が異なります。
このメソッドによって移動するのは要素を含むドキュメントであって、要素自身ではありません。つまり変化するのはelement.Parent.ScrollRectangleであって、element.ScrollRectangleではありません。
スクロール位置を細かく制御するならば、このメソッドを用いず親要素のScrollTopやScrollLeftに値を設定します。
HtmlElement parent = element.OffsetParent; parent.ScrollTop = element.OffsetRectangle.Top - parent.OffsetRectangle.Top;
≫JavaScriptでの要素を含むドキュメントのスクロール
| イベント | 発生タイミング |
|---|---|
| Click | 要素がクリックされたとき |
| DoubleClick | 要素がダブルクリックされたとき |
| Drag | テキストがドラッグされたとき |
| DragEnd | ドラッグが終了したとき |
上記以外のイベントは、AttachEventHandler()で捕捉できます。
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