あらかじめ日記

雑記とかブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

【C#】HtmlElementのNextSibling(次の要素)とPreviousSibling(前の要素)

以前より、WebBrowserHtmlElementの操作を色々と調べていた時のメモ。

前回の記事はこちら。
 

allthewayfrom.hatenablog.com

HtmlElementには次の要素(親要素に対して自身の次の兄弟要素)を示す、NextSiblingと言うメンバがあります。
そうなると、何か処理を行う上で「前の要素」も参照したいケースも出てくると思います。

が、なぜかHtmlElementには存在しません。

ただ、JavaScriptを知っている人ならピンと来るかと思いますが内部的なDomElementではきちんと構築されていてpreviousSiblingがあって、IHTMLDOMNodeのメンバで参照できます。
なら用意してくれても良いのに、、と思うところですが、仕方ないので自前で作ったサンプルが以下です。

public HtmlElement PreviousSibling (HtmlElement htmlElm)
{
	HtmlElement  prevElm = null;
	IHTMLDOMNode domNode = htmlElm.DomElement as IHTMLDOMNode;

	if (domNode != null && domNode.previousSibling != null && htmlElm.Parent != null) {

		foreach (HtmlElement eachElm in htmlElm.Parent.Children) {

			if (eachElm.DomElement == domNode.previousSibling) {

				prevElm = eachElm;
				break;
			}
		}
	}

	return prevElm;
}


HtmlElementからIHTMLDOMNodeを受けて、previousSiblingを参照します。
前の要素に対する情報が欲しい場合はpreviousSiblingで値を参照するだけですが、HtmlElementとして取得したい場合、ここで見ているpreviousSiblingIHTMLDOMNodeなので、当然そのままではHtmlElementとして受け取れません。

そのため、一旦親から子を辿って探す方法になります。

ただ、結局兄弟を全件探すならわざわざIHTMLDOMNodepreviousSiblingを見る必要も無い訳ですが、まぁ検索が1回少なくなると言うことで^^;
(一応、MSDNのChildrenプロパティの項を見ると「格納されている順序で返されるとは限らない」とあるのでこの方が確実ではありますね。
ただ格納した順序以外で返るケースは出会ったことが無いですが、、子要素内の途中へInsertに繰り返すと起こるのでしょうか。。)