ラベル VB の投稿を表示しています。 すべての投稿を表示
ラベル VB の投稿を表示しています。 すべての投稿を表示

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してしまった場合、配列の参照エラーになりますのでお気をつけください。

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

2013年4月3日水曜日

VBA:FileSystemObjectは解放した方がいい

VBAの話です。
FileSystemObjectは解放すべきかどうなのか今までよく判らなかったんですが、解放した方がいいですね。
コードの中で一度や二度使って終了するなら解放しなくていいと思いますが、ループで繰り返し使う場合はプログラムが途中で止まってしまったりします。
私の場合はフォルダにあるファイルを1件ずつ検索し、ファイル名のリストと合致していたらある処理をする・・・という関数を、合計2000回くらいループで実行させてたんですが、プログラムの実行が終わっているのにwindowsのお待ちください状態が止まらない現象にあいました。
原因は関数の中でcreateしたFSOを初期化しなかったからだと思います。
Sub Hogehoge
  Dim FSO As Object
  Set FSO = CreateObject("Scripting.FileSystemObject")
  (処理)
  Set FSO = Nothing
End Sub
こんな感じで解放するとよいと思われます。

2011年11月6日日曜日

VB.NET 省略可能な引数を持つ関数

Private Sub OptionalFunction _
(ByVal Name As String, Optional ByVal Value As String = "Default")
  Console.WriteLine("hogehoge", Name, Value)
End Sub
・Optionalキーワードを指定する場合、初期値を設定する必要がある。
・引数省略時には、初期値に設定した値が使用される。

2011年10月23日日曜日

vbのstrConv非対応文字列

vbのstrConvはダブルクオーテーション、シングルクォーテーション、¥マークに非対応。

・strTarget = strTarget.Replace("\", "¥")
・strTarget = strTarget.Replace("'", "’")
・strTarget = strTarget.Replace("""", Chr(&H814A))

で対応しました。

正確には、「\」は「\」、 「"」は「"」、「'」は「'」になるだけなんですけどorz