xml - 簡易 XML パーサ ------------------------------------------------------------------------------ XMLAttr struct _XMLAttr { gchar *name; gchar *value; }; XML タグの各属性を表します。属性名と値から構成されます。 ------------------------------------------------------------------------------ XMLTag struct _XMLTag { gchar *tag; GList *attr; }; XML タグを表します。タグ名と属性リストから構成されます。 ------------------------------------------------------------------------------ XMLNode struct _XMLNode { XMLTag *tag; gchar *element; }; XML の各ノードを表します。タグ情報と要素となるデータから構成されます。 ------------------------------------------------------------------------------ XMLFile struct _XMLFile { FILE *fp; GString *buf; gchar *bufp; gchar *dtd; gchar *encoding; GList *tag_stack; guint level; gboolean is_empty_element; }; XML ファイルを読み出すときに使用する構造体です。 XML ファイルの処理中の情報が格納されます。 ------------------------------------------------------------------------------ XMLFile *xml_open_file (const gchar *path); XML ファイルを開き、 XMLFile 構造体を生成して返します。 返った値は xml_close_file() で閉じます。 path: XML ファイルのパス 戻り値: 新規 XMLFile 構造体へのポインタ エラーの場合 NULL ------------------------------------------------------------------------------ void xml_close_file (XMLFile *file); xml_open_file() で開いた XML ファイルを閉じ、メモリを解放します。 file: XMLFile 構造体へのポインタ ------------------------------------------------------------------------------ GNode *xml_parse_file (const gchar *path); XML ファイル全体を解析し、ツリーを生成して返します。 ツリーは各ノードに XMLNode 構造体をもつ GNode として返されます。 返った値は xml_free_tree() で解放する必要があります。 path: XML ファイルのパス 戻り値: 新規 GNode 構造体へのポインタ ------------------------------------------------------------------------------ gint xml_get_dtd (XMLFile *file); XML ファイルの先頭の XML 宣言の情報を取得します。 xml_open_file() の直後に呼ぶ必要があります。 この時点で XML ファイルのエンコーディングが決定されます。 file: XMLFile 構造体へのポインタ 戻り値: 成功した場合 0 XML 宣言を取得できなかった場合 -1 ------------------------------------------------------------------------------ gint xml_parse_next_tag (XMLFile *file); XML ファイルの現在位置以降に最初に現れるタグをパースします。 タグの階層が深くなる毎に XMLTag は file 中のスタックに積まれていきます。 終了タグ()が現れた場合はスタックの先頭の該当するタグは除去されます。 file: XMLFile 構造体へのポインタ 戻り値: 成功した場合 0 エラーの場合 -1 ------------------------------------------------------------------------------ void xml_push_tag (XMLFile *file, XMLTag *tag); XML タグ tag をスタックの先頭に積みます。 file: XMLFile 構造体へのポインタ tag: XMLTag 構造体へのポインタ ------------------------------------------------------------------------------ void xml_pop_tag (XMLFile *file); XML タグをスタックの先頭から除きます。 除かれた XMLTag は削除されます。 file: XMLFile 構造体へのポインタ ------------------------------------------------------------------------------ XMLTag *xml_get_current_tag (XMLFile *file); 現在スタックの先頭にある XMLTag を取得します。 file: XMLFile 構造体へのポインタ 戻り値: スタックの先頭のXMLTag 構造体へのポインタ スタックが空の場合 NULL ------------------------------------------------------------------------------ GList *xml_get_current_tag_attr(XMLFile *file); 現在スタックの先頭にある XMLTag の属性 XMLAttr のリストを取得します。 file: XMLFile 構造体へのポインタ 戻り値: XMLAttr 構造体へのポインタのリスト スタックが空、または XMLTag が属性を持たない場合 NULL ------------------------------------------------------------------------------ gchar *xml_get_element (XMLFile *file); XML ファイルの現在位置から次の任意のタグまでのテキストデータを取得します。 xml_parse_next_tag() で該当タグをパースした直後に呼び出す必要があります。 テキストデータの前後の空白は除去されます。 返った値は g_free() で解放する必要があります。 file: XMLFile 構造体へのポインタ 戻り値: 取得したテキストデータ エラーの場合 NULL ------------------------------------------------------------------------------ gint xml_read_line (XMLFile *file); XML ファイルから1行読み込み、内部のバッファに格納します。 file: XMLFile 構造体へのポインタ ------------------------------------------------------------------------------ void xml_truncate_buf (XMLFile *file); 内部バッファの読み込み位置が先頭より後にある場合、先頭から読み込み位置までの 不要なデータを切り詰めます。 file: XMLFile 構造体へのポインタ ------------------------------------------------------------------------------ gboolean xml_compare_tag (XMLFile *file, const gchar *name); スタックの先頭のタグ名が name に一致するかどうかを調べます。 大小文字は区別されます。 file: XMLFile 構造体へのポインタ name: タグ名 戻り値: スタックの先頭のタグ名が name と一致する場合 TRUE 一致しない、またはスタックが空の場合 FALSE ------------------------------------------------------------------------------ XMLNode *xml_node_new (XMLTag *tag, const gchar *text); XML タグ tag とテキストデータ text を要素に持つ XMLNode を作成します。 返った値は xml_free_node() で解放する必要があります。 tag: XMLTag 構造体へのポインタ text: tag に対応するテキストデータ 戻り値: 新規 XMLNode 構造体へのポインタ ------------------------------------------------------------------------------ XMLTag *xml_tag_new (const gchar *tag); XML タグ名 tag から XMLTag を作成します。 返った値は XMLNode にした上で xml_free_node() 等で解放する必要があります。 tag: XML タグ名 戻り値: 新規 XMLTag 構造体へのポインタ ------------------------------------------------------------------------------ XMLAttr *xml_attr_new (const gchar *name, const gchar *value); 属性名 name と値 value をもつ XMLAttr を作成します。 返った値は XMLTag の要素に追加した上で xml_free_node() 等で解放する必要が あります。 name: 属性名 value: 属性値 戻り値: 新規 XMLAttr 構造体へのポインタ ------------------------------------------------------------------------------ void xml_tag_add_attr (XMLTag *tag, XMLAttr *attr); XMLAttr attr を XMLTag tag の属性リストに追加します。 tag: XMLTag 構造体へのポインタ attr: XMLAttr 構造体へのポインタ ------------------------------------------------------------------------------ XMLTag *xml_copy_tag (XMLTag *tag); XMLTag 構造体を複製します。属性リストも含めて複製されます。 tag: XMLTag 構造体へのポインタ 戻り値: 複製された XMLTag 構造体へのポインタ ------------------------------------------------------------------------------ XMLAttr *xml_copy_attr (XMLAttr *attr); XMLAttr 構造体を複製します。 attr: XMLAttr 構造体へのポインタ 戻り値: 複製された XMLAttr 構造体へのポインタ ------------------------------------------------------------------------------ gint xml_unescape_str (gchar *str); XML エスケープ("&...;")された文字列 str のエスケープを解除します。 文字列 str は上書きされます。 str: XML エスケープされた文字列 戻り値: 成功した場合 0 エラーの場合 -1 ------------------------------------------------------------------------------ gint xml_file_put_escape_str (FILE *fp, const gchar *str); 文字列 str のうちエスケープが必要な文字を XML エスケープしてファイルストリーム fp に出力します。 fp: ファイルストリーム str: XML エスケープされていない文字列 戻り値: 成功した場合 0 エラーの場合 -1 ------------------------------------------------------------------------------ gint xml_file_put_xml_decl (FILE *fp); ファイルストリーム fp に XML 宣言文字列を出力します。 fp: ファイルストリーム 戻り値: 成功した場合 0 エラーの場合 -1 ------------------------------------------------------------------------------ gint xml_file_put_node (FILE *fp, XMLNode *node); node の内容をファイルストリーム fp に出力します。 fp: ファイルストリーム node: XMLNode 構造体へのポインタ 戻り値: 成功した場合 0 エラーの場合 -1 ------------------------------------------------------------------------------ void xml_free_node (XMLNode *node); XMLNode 構造体を解放します。 node: XMLNode 構造体へのポインタ ------------------------------------------------------------------------------ void xml_free_tree (GNode *node); 各ノードに XMLNode 構造体をもつ GNode ツリーを解放します。 node: GNode ツリーのルートを指すポインタ