【C#】HtmlElementのNextSibling(次の要素)とPreviousSibling(前の要素)
以前より、WebBrowserのHtmlElementの操作を色々と調べていた時のメモ。
前回の記事はこちら。
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として取得したい場合、ここで見ているpreviousSiblingはIHTMLDOMNodeなので、当然そのままではHtmlElementとして受け取れません。
そのため、一旦親から子を辿って探す方法になります。
ただ、結局兄弟を全件探すならわざわざIHTMLDOMNodeのpreviousSiblingを見る必要も無い訳ですが、まぁ検索が1回少なくなると言うことで^^;
(一応、MSDNのChildrenプロパティの項を見ると「格納されている順序で返されるとは限らない」とあるのでこの方が確実ではありますね。
ただ格納した順序以外で返るケースは出会ったことが無いですが、、子要素内の途中へInsertに繰り返すと起こるのでしょうか。。)