1

HTMLドキュメントを文字列としてロードして解析する必要があるプロジェクトがあります。どのHTMLノードがページの高さ(8.5x11)を超えるかを判断しようとしているので、その前に「page-break-after」を挿入できます。これは、私が作成している.NETdllを使用して実行されます。

mshtmldomを使ってみました。これに文字列値をロードするのは簡単ではありません。これを達成できたとき、offsetHeight(etc)プロパティは常にゼロを返します。これを機能させるために私が見つけた唯一の方法は、HTMLをディスクに保存し、SHDocVw.InternetExplorerを介してロードし、それをmshtmldomに渡すことです。

HTMLがSHDocVwによって「レンダリング」されない限り、これは画面のピクセルに基づいているため、mshtmlが報告するoffsetHeight情報がないと想定しています。私は間違っている可能性があります。

私の現在のコードは次のとおりです。

Dim myIE As New SHDocVw.InternetExplorer
myIE.Navigate("D:\Temp\Test.HTML")
Dim myDoc As mshtml.HTMLDocument = CType(myIE.Document, mshtml.HTMLDocument)

Dim divTag As mshtml.IHTMLElement = myDoc.getElementById("someID")

For Each childNode As mshtml.IHTMLElement In TryCast(divTag.children, mshtml.IHTMLElementCollection)
    If childNode.offsetTop + childNode.offsetHeight > 750 Then '72pixels = 1 inch.
         childNode.insertAdjacentHTML("beforeBegin", "<DIV style='page-break-after:always'></DIV>") 
    End If
Next

私には2つの目標があります。#1が鍵であり、#2が理想的です。

1)文字列からHTMLをロードし、上記のコードを引き続き機能させます。

2)理想的には、同じことを行う.NETコンポーネントを見つけます。選択の余地がない限り、.NETのCOMコンポーネントに依存するのは好きではありません。

4

2 に答える 2

0

WebBrowser (おそらく、確かではありません) は HTML 文字列を受け取り、それをナビゲート可能な DOM に変換します。再利用します。HTML パーサーを再発明しないでください。プロジェクトの終わりには、より多くの髪が残ります。

于 2010-02-26T17:39:41.670 に答える
-1

HTML の最も完全なパーサーであり、HTML 構造に基づいて DOM ツリーを作成する CodeplexのHtml Agility Packを使用します。

于 2010-02-26T17:40:45.240 に答える