3

HTMLフラグメントを解析する必要があります。つまり、ファイルには<html>、<head>、および<body>要素がなく、それ以外の場合は整形式のXHTML構文があり、UTF8エンコーディングが保証されています。libxmlはこのタスクに理想的であるように見えますが、実装方法がわからない特定の制約があります。

  1. htmlSAXParseFile()は十分に機能しますが、DOM自体を作成し、プロセスにbody要素とhtml要素を挿入しているようです。一部の要素をスキップして他の要素をその場で変更する必要がある場合があるため、自分でDOMを作成したいと思います。どういうわけかlibxmlにDOMをまったく作成せず、HTMLを解析してハンドラーを呼び出すように指示することは可能ですか?
  2. libxml HTMLパーサーでそれが不可能な場合は、DOMを作成していないように見えるxmlSAXUserParseFile()を使用することもできます。ただし、ファイルは<p> ... </ p> <p> ... </ p>のような構造であるため、パーサーは「ドキュメントの最後にある余分なコンテンツ」を早すぎて吐き出します。いくつかの解析エラーについて通知を受けながら、それらを抑制する方法はありますか(これらのファイルに他のエラーが発生しないことを誰も保証していないため)?
  3. libxmlには非常に多くの解析関数があり、そのうちのいくつかはxmlParserOptionをパラメーターとして受け入れます。残念ながら、xmlSAXUserParseFile()はそうではありません。そして、それらはすべて、いくつかの無関係なAPI設計上の理由でDOMを作成しているようです。明らかな候補がありませんか?

ああ、そして私はlibxmlのDOMを使用することに抵抗があるように見えることを告白します。私はRAMに非常に制約があるため、メモリ不足の状態で一部のノードをドロップし、必要に応じてそれらを再読み取りできるようにするには、DOMを完全に制御する必要があります。

前もって感謝します。

4

1 に答える 1

6

OK、誰も質問に答えていないので、私は自分で答えようとします。

すべての開始/終了要素ハンドラーを作成しましたが、libxmlはDOMを作成しなくなったようです。少なくとも、返されるドキュメントポインタはNULLです。それはまだhtmlとbody要素を主張します、しかし私はそれで生きることができます。

大きな問題の1つは、libxmlが何があってもすべての空白ノードを保持することです。したがって、無視できる空白を排除するためにテキストコンテンツを解析する必要があります。それは醜いですが、それは動作します。UTF-8の解析は、めったに見逃せないような楽しみです。

正直なところ、libxmlのドキュメントはひどいものです。ドキュメントを読もうとする人への私のアドバイス:代わりにソースコードを読んでください。コードははるかに読みやすく、文書化されています。

ご清聴ありがとうございました。

于 2010-06-08T20:33:12.917 に答える