2

expatを使用してxmlパーサーを作成しています。ちょうどこれを見た:

XML_SetElementHandler
     XML_Parser parser,
     XML_StartElementHandler start,
     XML_EndElementHandler end

どうすればよいかわかりません。関数へのポインタであることがわかります。

typedef void (*XML_StartElementHandler)(void *userData,
                    const XML_Char *name,
                    const XML_Char **atts);

しかし、私はそれが助けを得たいと思うべきことをどこにも見つけることができません!

4

1 に答える 1

2

パーサー(へのポインター)に2つの関数を指定します。1つはパーサーがXML要素の開始を確認したときに呼び出され(つまり、開始タグを読み取った後)、もう1つは終了を確認したときに呼び出されます。要素(つまり、終了タグを読み取る)(XML解析を行うには、要素とタグの違いを実際に理解する必要があります)。

要素の先頭でパーサーが呼び出す関数は、次の3つの引数で呼び出されます。

  1. 最初に「ユーザーデータ」としてパーサーに渡したものへのジェネリック(void *)ポインター(実際に渡した場合)。これは、コールバック間の状態を維持するために使用したいものです。
  2. 要素名のテキストを含む文字配列(つまり文字列)へのポインタ。
  3. 要素に関連付けられた属性と値のペア(つまり、開始タグにリストされている属性)の各部分に1つのメンバーがある、文字列の配列へのポインター(OK、ここでは厳密には正しくありません)。したがって、atts[i]が属性の場合、atts[i+1]はその値です。

要素の終わりに対して呼び出される関数は、属性リストを取得しないため、引数のシグネチャが短くなります(これもIIRCです)。

最も一般的に使用されるXMLの場合、文字データ(つまり、開始タグと終了タグの間にあるもの)を処理するための文字ハンドラー関数も必要であり、一般的にはそうではないことを繰り返し思い出す必要があります。、すべての文字データで一度に呼び出されます。そのデータは、いくつかの別々の「チャンク」で提供される場合があります。

于 2012-09-19T14:25:19.320 に答える