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 ツリーのルートを指すポインタ
