2013年6月6日木曜日

VB:HTMLDocument InnerHTML, OuterHTMLでパス(hrefやsrc)がローカルのパスに変換されてしまう

VB (.NET Framework 2.0) のHTMLDocument (HTMLElement)のメソッドのInnerHTML, OuterHTMLでhref(aタグのhrefやimgタグのsrcなど)を出力すると、パスが自動的にローカルのパスに変換されてしまいます。
散々探したものの、変換されないようにすることは出来ないようで。
サーバ上で実行すればいいのかもしれませんが、ローカルで確認出来ないもの困ります。
そもそも相対パスがローカルからの絶対パスになってしまうわけで、サーバ上でもうまくいくのかどうか。
なかなかこれだという情報がなく。
今時VBでHTML解析するのも流行らないのでしょうか。。

似たようなお悩みの人は見つけました
avoid innerHTML parsing
http://bytes.com/topic/javascript/answers/91167-avoid-innerhtml-parsing

私はinnerHTMLで取得したものを処理する必要があったので、一度パスをすべて保管してから変換後に再設定することにしました。
泥臭いと思いつつ、URLにある解決策の方法で、いちいちタグを生成して変換後のHTMLの元の場所にappendChildして行くのが出来なかったのです。

こんな感じでまず最初に配列で取得しておいて(*_divはHtmlElement。bodyタグの中身)
Dim _as As HtmlElementCollection = _div.GetElementsByTagName("a")
Dim a_href() As String = Nothing
Dim href_count As Integer = 0
For Each _a As HtmlElement In _as
    ReDim Preserve a_href(href_count)
    a_href(href_count) = _a.GetAttribute("href")
    href_count = href_count + 1
Next
変換が終わったらこれで元に戻す。
href_count = 0 '初期化
For Each _a As HtmlElement In _as
    If (a_href(href_count) <> "") Then
        _a.SetAttribute("href", a_href(href_count))
    End If
    href_count = href_count + 1
Next
途中でurlやimgをappendしてしまった場合、配列の参照エラーになりますのでお気をつけください。

にしても、勝手に変換しないように出来るのが一番いいんですけれども。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。