2

私は、Web ページを解析して別の形式に変換する必要がある C# アプリケーションに取り組んでいます。出力形式やユースケースなどに深く入り込むことなく、私の問題は、特定の要素、この場合はほとんどの要素に対して計算された CSS を取得することです。<strong>,<em>,<u>インライン スタイル、CSS、および書式設定要素などの組み合わせを扱っています。

現在、Web ページを mshtml にロードし、IHTMLElement2 インターフェイスを使用して currentStyle オブジェクトにアクセスしています。これは遅すぎることが証明されています。私はそれをプロファイリングしましたが、 currentStyle.XXX への呼び出しを介してスタイルルールの値を取得するのにかなりの時間が費やされています。複数のプロパティ、つまり background-color、font-family、font-size、text-align、text-decoration などを各要素で繰り返し照会する必要があるため、何千もの COM 呼び出しを行っており、小さなものには数分かかります。資料。最新のブラウザはすべて、これを数分の 1 秒で実行します。私を殺しているのはCOM相互運用性だと思いますか?

より良い方法はありますか?要素に適用されるすべての計算されたスタイル ルールを一度に取得したいと考えています。IHTMLElementAppliedStyles の使い方を知っている人はいますか? それは私が探していることを行いますか、そしてそのインスタンスはどこで入手できますか? 補足: mshtml を取得するために HTML オブジェクト ライブラリを参照していますが、IE9/10 バージョンではないようです。すべてのインターフェイスが利用できるわけではありません。つまり、IHTMLDocument7 です。

ありがとう、

4

2 に答える 2

0

私はこれに取り組んでおり、いくつかの更新があります...

a) コードにバグがあり、80% や 1.2em などの相対値を pt などの絶対値に解決するためにツリーをたどり、その修正により速度が大幅に向上しました。私にはまだ少し遅すぎます.3ページのWord文書(表や順序付きリストなど)に相当するのは20〜30秒です。

b) CSS 値をキャッシュする IHTMLElement2 の C# ラッパー クラスを追加したので、COM 相互運用機能を介して Dom ノードごとに少なくとも 1 回読み取るだけで済みます。それは少し助けになったので、同じ 3 ページの word doc 同等の html で 8 ~ 10 秒に短縮されました。

c) すべての CSS 値を配列にロードし、単一の COM 相互運用呼び出しで配列全体を渡す IHTMLElement の C++ ラッパーの作成を検討していますが、これまでのところ、C++ および COM ラッパーは急な学習曲線のように見えます: MFC, ATL、COM、ああ。

d) 私は C++ の経験がなく、ラッパーのアイデアは非常に難しいように見えるので、C# css パーサーとリゾルバーを構築することを検討しているので、mshtml をダンプして htmlagilitypack + 私の css パーサー/リゾルバーを使用できます。また、大仕事。

コメント、ガイダンス、回答をお待ちしております ありがとうございます。

于 2013-05-31T23:22:31.957 に答える