0

私はlibxmlを初めて使用し、これまでのところすべてが良好ですが、libxmlが文字を報告するとき、つまりハンドラーの文字関数が呼び出されるとき、「」や「」などの「特殊」文字、または個別に報告されることに気づきました。例:

"It's a nice day today. Don't you agree?"
report:"
report: It
report: '
report: s a nice day today. Don
report: '
report: you aggree?
report: "

その動作を変更する方法はありますか?完全な文字列として報告されますか?誤解しないでください。strcatを使用して元の文字列をまとめることは問題ありませんが、それは追加の作業です;)

ヘッダーとネットを検索しましたが、解決策が見つかりませんでした。前もって感謝します。

編集:上記のハンドラーの説明にはもう少し説明が必要なためです。文字を報告するということは、ハンドラー(htmlSAXHandler)のhandler.charactersコールバック関数が呼び出されたときを意味します。

void _characters(void *context, const xmlChar *ch, int len) {
    printf("report: %s\n", chars);
}
4

2 に答える 2

1

ドキュメントがメモリ内にすべてを保持できないほど大きくない場合は、SAX コールバックを登録する代わりに DOM 解析を検討することをお勧めします。

#include <stdio.h>
#include <libxml/HTMLparser.h>
#include <libxml/tree.h>

int main()
{
  htmlDocPtr doc;
  xmlNodePtr root, node;
  char *output;
  char *rawhtml = "<html><body>\"It's a nice day today.  Don't you agree?\"</body></html>";
  doc = htmlReadDoc(rawhtml, NULL, NULL, XML_PARSE_NOBLANKS);
  root = xmlDocGetRootElement(doc);
  node = root->children;
  output = xmlNodeGetContent(node);
  printf("output=[%s]\n", output);
  if(output)
    xmlFree(output);
  if(doc)
    xmlFreeDoc(doc);
}

生産する

output=["It's a nice day today.  Don't you agree?"]
于 2012-11-01T14:10:45.090 に答える
0

あなたはそれと一緒に暮らすべきだと思います。10 万文字の HTML ドキュメントに遭遇した場合、すべての文字が一度に配信されることを期待しますか? いつでもキャラクターを分割する準備ができている必要があると思います。次に、それらを特殊文字で分割しても違いはありません。

ソフトウェアが小さな HTML ドキュメントのみを読み取ることを目的としている場合、この答えは適切ではありませんが、libxml の作成者はそのような場合の特別な処理を考えていなかったに違いありません。

于 2012-11-01T08:41:10.237 に答える