Tiny XML ライブラリ. More...
#include "txml.h"
#include "jbxl_state.h"
Go to the source code of this file.
Functions | |
tXML * | xml_parse (char *pp) |
文字列のXMLデータを解釈して,tXMLのツリーを生成する. | |
tXML * | xml_parse_file (const char *fn) |
ファイルから読み込んでパースする. | |
tXML * | xml_parse_seq (tXML *xml, char *pp) |
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.断片的にXMLデータを入力する場合に使用する. | |
tXML * | xml_main_parse (tXML *xml, char *pp, int skip) |
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.パーサの内部的なメイン関数. | |
int | xml_parse_start_node (char *pp, char **node_name, char **node_attr, int *node_end) |
XMLの開始ノードを処理する.. | |
int | xml_parse_end_node (char *pp, char **node_name) |
XMLの終了ノードを処理する.. | |
int | xml_parse_content (char *pp, char **content) |
XMLのコンテントを処理する.. | |
tList * | xml_parse_attr (char *pp) |
XMLのノード属性を解釈して,リスト(tList)にする.. | |
int | xml_parse_processing_node (char *pp, char **node_name, char **node_attr) |
XMLのプロセッシングノードを処理する. | |
int | xml_parse_comment_node (char *pp, char **comment) |
XMLのコメントノードを処理する.. | |
int | xml_parse_data_node (char *pp, char **data) |
XMLのデータノード(その他エレメントノードなど)を処理する.. | |
int | isnot_xml_name (unsigned char *pp) |
XML名として不適切かどうかを大まかに判断する.. | |
void | close_xml (tXML *pp) |
パースエラーを起こしたツリーを強制的に正常化する. | |
Buffer | xml_inverse_parse (tXML *pp, int mode) |
ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆. | |
void | xml_to_Buffer (tXML *pp, Buffer *buf, int mode, int indent) |
xml_inverse_parse()用の補助関数. | |
void | xml_open_node_Buffer (tXML *pp, Buffer *buf, int mode, int indent) |
ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する. | |
void | xml_close_node_Buffer (tXML *pp, Buffer *buf, int mode, int indent) |
ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する. | |
void | xml_attr_to_Buffer (tList *pp, Buffer *buf) |
リストに保存されたノードの属性をテキストへ戻す. | |
tXML * | init_xml_doc () |
XML のドキュメントヘッダを作成する.. | |
tXML * | add_xml_node (tXML *xml, const char *name) |
XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.. | |
tXML * | insert_xml_node (tXML *xml, const char *name) |
XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する.. | |
tXML * | add_xml_content (tXML *xml, const char *content) |
XMLツリーのxml の直下にコンテントを挿入する.. | |
tXML * | append_xml_content (tXML *xml, const char *content) |
XMLツリーのxml の直下のコンテントノードにコンテンツを追加する.. | |
int | add_xml_content_area (tXML *xml, int len) |
xml に空のコンテントノードを追加する. | |
tXML * | add_xml_attr (tXML *xml, const char *attr) |
xml に属性(attr)を追加する. | |
tXML * | add_xml_attr_str (tXML *xml, const char *name, const char *value) |
xml に属性名 name, 文字列の属性値 value を持つノードを追加する. | |
tXML * | add_xml_attr_int (tXML *xml, const char *name, int value) |
xml に属性名 name, 整数の属性値 value を持つノードを追加する. | |
tXML * | add_xml_attr_float (tXML *xml, const char *name, float value) |
xml に属性名 name, float型実数の属性値 value を持つノードを追加する. | |
tXML * | add_xml_attr_double (tXML *xml, const char *name, double value) |
xml に属性名 name, double型実数の属性値 value を持つノードを追加する. | |
char * | get_first_xml_nodename (tXML *xml) |
XMLツリーの最初のノードの名前を返す.. | |
Buffer | make_xml_attr_bystr (const char *name, const char *value) |
属性名 name, 文字列の属性値 value を持つ Buffer型変数を作成する. | |
Buffer | make_xml_attr_byint (const char *name, int value) |
属性名 name, 整数の属性値 value を持つ Buffer型変数を作成する. | |
Buffer | make_xml_attr_byfloat (const char *name, float value) |
属性名 name, float型実数の属性値 value を持つ Buffer型変数を作成する. | |
Buffer | make_xml_attr_bydouble (const char *name, double value) |
属性名 name, double型実数の属性値 value を持つ Buffer型変数を作成する. | |
char * | xml_get_node_content (tXML *node) |
コンテントへのポインタを返す.free() してはいけない. | |
char * | xml_get_node_attr (tXML *node, const char *attr) |
属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない. | |
tXML * | dup_merge_xml (tXML *pp, tXML *tp) |
XMLツリー ppの直下にXMLツリー tpを複製する.. | |
void | print_xml (FILE *fp, tXML *pp, int mode) |
XMLの表示(出力).. | |
void | print_xml_node (FILE *fp, tXML *pp) |
MLのノード情報を表示する.デバッグ用.. | |
void | print_xml_tree (FILE *fp, tXML *pp, const char *space) |
XMLツリーをそのままツリー表示する.デバッグ用.. | |
void | print_sister_xml_tree (FILE *fp, tXML *pp, const char *space) |
XMLツリーの表示.ppの姉妹ノードも出力する.. | |
tXML * | get_xml_node (tXML *pp, tXML *pt) |
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す. | |
int | set_xml_node (tXML *pp, tXML *pt, const char *name) |
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする. | |
int | set_xml_end_node (tXML *pp, tXML *pt) |
同じパターンの枝を探し,ptに最初に一致した枝の, | |
tXML * | get_xml_content (tXML *pp, tXML *pt) |
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのコンテントへのポインタを返す. | |
int | set_xml_content (tXML *pp, tXML *pt, const char *content) |
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後ノードに対応したのノードのコンテントを contentで置き換える. | |
int | get_xml_int_content (tXML *pp, tXML *pt) |
get_xml_content() を使用し,XML コンテンツの内容を int型で返す. | |
float | get_xml_float_content (tXML *pp, tXML *pt) |
get_xml_content() を使用し,XML コンテンツの内容を float型で返す. | |
double | get_xml_double_content (tXML *pp, tXML *pt) |
get_xml_content() を使用し,XML コンテンツの内容を double型で返す. | |
char * | get_xml_char_content (tXML *pp, tXML *pt) |
get_xml_content() を使用し,XML コンテンツの内容を char*型で返す.free() してはいけない. | |
tList * | get_xml_attr (tXML *pp, tXML *pt) |
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノード属性値へのリストを返す. | |
char * | get_xml_char_attr (tXML *pp, tXML *pt, const char *attr) |
get_xml_node() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない. | |
int | get_xml_int_attr (tXML *pp, tXML *pt, const char *attr) |
get_xml_node() で検索したノードから,属性値 attrの値を int型で取り出す. | |
double | get_xml_double_attr (tXML *pp, tXML *pt, const char *attr) |
get_xml_node() で検索したノードから,属性値 attrの値を double型で取り出す. | |
int | set_xml_attr (tXML *pp, tXML *pt, tList *at) |
同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードのノードの属性としてatの値をコピーする. | |
int | replace_xml_content (tXML *pp, tXML *pt, const char *src, const char *dst) |
get_xml_content() を使用し,XMLキーの src部分を dstで書き換える. | |
tXML * | get_xml_node_bystr (tXML *pp, const char *str) |
get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン | |
int | set_xml_node_bystr (tXML *pp, const char *str, const char *val) |
set_xml_node(tXML* pp, tXML* pt, const char* val) の _bystr バージョン | |
int | set_xml_end_node_bystr (tXML *pp, const char *str) |
set_xml_end_node(tXML* pp, tXML* pt) の _bystr バージョン | |
tXML * | get_xml_content_bystr (tXML *pp, const char *str) |
get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン | |
int | get_xml_int_content_bystr (tXML *pp, const char *str) |
get_xml_int_content(tXML* pp, tXML* pt) の _bystr バージョン | |
float | get_xml_float_content_bystr (tXML *pp, const char *str) |
get_xml_float_content(tXML* pp, tXML* pt) の _bystr バージョン. | |
double | get_xml_double_content_bystr (tXML *pp, const char *str) |
get_xml_double_content(tXML* pp, tXML* pt) の _bystr バージョン. | |
char * | get_xml_char_content_bystr (tXML *pp, const char *str) |
get_xml_char_content(tXML* pp, tXML* pt) の _bystr バージョン.free() してはいけない. | |
int | set_xml_content_bystr (tXML *pp, const char *str, const char *val) |
set_xml_content(tXML* pp, tXML* pt, char* val) の _bystr バージョン | |
tList * | get_xml_attr_bystr (tXML *pp, const char *str) |
get_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン. | |
char * | get_xml_char_attr_bystr (tXML *pp, const char *str, const char *attr) |
get_xml_char_attr() の _bystr バージョン.free() してはいけない. | |
int | get_xml_int_attr_bystr (tXML *pp, const char *str, const char *attr) |
get_xml_int_attr() の _bystr バージョン. | |
double | get_xml_double_attr_bystr (tXML *pp, const char *str, const char *attr) |
get_xml_double_attr() の _bystr バージョン. | |
int | set_xml_attr_bystr (tXML *pp, const char *str, tList *at) |
set_xml_attr(tXML* pp, tXML* pt, tList* at) の _bystr バージョン. | |
int | replace_xml_content_bystr (tXML *pp, const char *str, const char *src, const char *dst) |
replace_xml_content(tXML*pp, tXML* pt, char* src, char* dst) の _bystr バージョン. | |
tList * | get_xml_node_list (tXML *pp, tXML *pt) |
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへのポインタをリストに格納して返す.. | |
tList * | get_xml_content_list (tXML *pp, tXML *pt) |
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードのコンテントへのポインタをリストに格納して返す.. | |
int | set_xml_content_list (tXML *pp, tXML *pt, const char *content) |
get_xml_content_list() で検出したコンテントを, content で置き換える. | |
tList * | get_xml_node_list_bystr (tXML *pp, const char *str) |
get_xml_node_list() の _bystr バージョン. | |
tList * | get_xml_content_list_bystr (tXML *pp, const char *str) |
get_xml_conetnt_list_bystr() の _bystr バージョン. | |
int | set_xml_content_list_bystr (tXML *pp, const char *str, const char *content) |
set_xml_content_list_bystr() の _bystr バージョン. | |
int | find_match_xml (tXML *pp, tXML *pt) |
ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索するので注意. | |
tXML * | find_match_xml_endlist (tXML *pp, tXML *pt) |
ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す. | |
tList * | find_match_xml_endlist_rcsv (tXML *pp, tXML *pt, tXML *te) |
find_match_xml_endlist() の補助関数 | |
tXML * | find_match_xml_end_node (tXML *pp, tXML *pt) |
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptの最後のノードに対応する pp内のノードへのポインタを返す.. | |
int | check_match_xml (tXML *tp, tXML *tr) |
XMLツリー tpが XMLツリー trと同じかどうかを検査する.. | |
tXML * | cmp_sisters_xml (tXML *tp, tXML *tr) |
XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する.. | |
Buffer | get_node_content (tXML *tp, const char *name, int no) |
tp中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る. | |
int | get_node_integer (tXML *tp, const char *name, int no) |
tp中のXMLデータから no番目のノード '<node_name>node_content(整数)</node_name>' の node_content(整数)を得る. | |
int | return_exist_node (tXML *tp, const char *name, int no, Buffer *content) |
bufの中に ノード '<name>content</name>' が存在するかどうかチェックする. | |
int | replace_all_node_integer (tXML *tp, const char *name, int src, int dst) |
XMLツリー pp内で ノード名が nameである全てのノードのコンテント(整数)を,srcから dstに書き換える.. | |
int | replace_all_node_contents (tXML *pp, const char *name, const char *src, const char *dst) |
XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える.. | |
int | replace_all_node_contents_rcsv (tXML *pp, const char *name, const char *src, const char *dst) |
replace_all_node_content() の補助関数 | |
int | replace_all_node_byid (tXML *pp, const char *src, const char *dst, int id) |
XMLツリー pp内で ノードの種別が idである全てのノードの内容を srcから dstに書き換える.. | |
int | replace_all_node_byid_rcsv (tXML *pp, const char *src, const char *dst, int id) |
replace_all_node_byid() の補助関数 | |
Buffer | xml_rpc_request_pack (const char *name, tXML *xml) |
XML-RPC用のデータを生成する.. | |
tXML * | xml_rpc_add_member (tXML *xml, char *name, char *value, char *kind) |
XML-RPC の <member> データを作って,繋げていく.. | |
tXML * | xml_rpc_end_member (tXML *xml) |
<struct><member> データを閉じて,<value> データを作り出す. | |
tXML * | xml_rpc_add_array (tXML *xml, tXML *array) |
<value><struct> データから 配列データ <data>...</data> を作って繋げていく. | |
tXML * | xml_rpc_end_array (tXML *xml) |
配列データを閉じて,送信用データを生成する. |
Definition in file txml.c.
tXML* add_xml_attr(tXML* xml, const char* attr)
xml に属性ノード(attr)を追加する.
Definition at line 1358 of file txml.c.
References add_tList_end(), XML_NAME_NODE, and xml_parse_attr().
Referenced by add_xml_attr_double(), add_xml_attr_float(), add_xml_attr_int(), and add_xml_attr_str().
01359 { 01360 if (xml==NULL || attr==NULL) return NULL; 01361 if (xml->ldat.id!=XML_NAME_NODE) return NULL; 01362 01363 tList* lp = xml_parse_attr((char*)attr); 01364 01365 if (xml->ldat.lst==NULL) xml->ldat.lst = lp; 01366 else add_tList_end(xml->ldat.lst, lp); 01367 01368 return xml; 01369 }
tXML* add_xml_attr_double(tXML* xml, const char* name, double value)
xml に属性名 name, double型実数の属性値 value を持つノードを追加する.
Definition at line 1428 of file txml.c.
References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_double.
01429 { 01430 if (xml==NULL || name==NULL) return NULL; 01431 // 01432 Buffer attr = make_xml_attr_double(name, value); 01433 add_xml_attr(xml, (char*)attr.buf); 01434 free_Buffer(&attr); 01435 01436 return xml; 01437 }
tXML* add_xml_attr_float(tXML* xml, const char* name, float value)
xml に属性名 name, float型実数の属性値 value を持つノードを追加する.
Definition at line 1411 of file txml.c.
References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_float.
01412 { 01413 if (xml==NULL || name==NULL) return NULL; 01414 // 01415 Buffer attr = make_xml_attr_float(name, value); 01416 add_xml_attr(xml, (char*)attr.buf); 01417 free_Buffer(&attr); 01418 01419 return xml; 01420 }
tXML* add_xml_attr_int(tXML* xml, const char* name, int value)
xml に属性名 name, 整数の属性値 value を持つノードを追加する.
Definition at line 1394 of file txml.c.
References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_int.
01395 { 01396 if (xml==NULL || name==NULL) return NULL; 01397 // 01398 Buffer attr = make_xml_attr_int(name, value); 01399 add_xml_attr(xml, (char*)attr.buf); 01400 free_Buffer(&attr); 01401 01402 return xml; 01403 }
tXML* add_xml_attr_str(tXML* xml, const char* name, const char* value)
xml に属性名 name, 文字列の属性値 value を持つノードを追加する.
Definition at line 1377 of file txml.c.
References add_xml_attr(), Buffer::buf, free_Buffer(), and make_xml_attr_str.
01378 { 01379 if (xml==NULL || name==NULL) return NULL; 01380 01381 Buffer attr = make_xml_attr_str(name, value); 01382 add_xml_attr(xml, (char*)attr.buf); 01383 free_Buffer(&attr); 01384 01385 return xml; 01386 }
tXML* add_xml_content(tXML* xml, const char* content)
XMLツリーのxml の直下にコンテントを挿入する.
コンテントが複数ある場合は末っ子のノードとして挿入する.
xmlがノード名ノードでなければエラー(NULLが返る)
Definition at line 1280 of file txml.c.
References add_tTree_node_bystr(), JBXL_XML_NODE_CLOSED, XML_CONTENT_NODE, and XML_NAME_NODE.
Referenced by add_xml_content_area(), append_xml_content(), get_xml_content(), get_xml_content_list(), xml_rpc_add_member(), and xml_rpc_request_pack().
01281 { 01282 tList* pp; 01283 01284 if (xml==NULL || content==NULL) return NULL; 01285 if (xml->ldat.id!=XML_NAME_NODE) return NULL; 01286 01287 pp = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, content, NULL, NULL, 0); 01288 pp->state = JBXL_XML_NODE_CLOSED; 01289 if (pp->prev!=NULL) pp->prev->ldat.lv++; 01290 01291 return pp; 01292 }
int add_xml_content_area | ( | tXML * | xml, | |
int | len | |||
) |
int add_xml_content_area(tXML* xml, int len)
xml に空のコンテントノードを追加する.
xml | コンテントノードを追加するノード. | |
len | コンテンツノードの大きさ(バイト) |
Definition at line 1333 of file txml.c.
References add_xml_content(), FALSE, and TRUE.
01334 { 01335 if (xml==NULL || len<=0) return FALSE; 01336 01337 char* area = (char*)malloc(len); 01338 if (area==NULL) return FALSE; 01339 memset(area, (int)' ', len-1); 01340 area[len-1] = '\0'; 01341 01342 tXML* pp = add_xml_content(xml, area); 01343 if (pp!=NULL) { 01344 pp->ldat.key.buf[0] = '\0'; 01345 pp->ldat.key.vldsz = 0; 01346 } 01347 free(area); 01348 01349 return TRUE; 01350 }
tXML* add_xml_node(tXML* xml, const char* name)
XMLツリーのxml の直下(姉妹の一番下:末っ子)にノード(属性は指定しない)を挿入する.
xml | 挿入するポイント | |
name | 挿入するノードの名前 |
Definition at line 1234 of file txml.c.
References add_tTree_node_bystr(), JBXL_XML_NODE_EMPTY, and XML_NAME_NODE.
Referenced by xml_rpc_add_array(), xml_rpc_add_member(), xml_rpc_end_array(), xml_rpc_end_member(), and xml_rpc_request_pack().
01235 { 01236 tXML* pp; 01237 01238 if (name==NULL) return NULL; 01239 01240 pp = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0); 01241 pp->state = JBXL_XML_NODE_EMPTY; 01242 if (pp->prev!=NULL) pp->prev->ldat.lv++; 01243 01244 return pp; 01245 }
tXML* append_xml_content(tXML* xml, const char* content)
XMLツリーのxml の直下のコンテントノードにコンテンツを追加する.
コンテントノードが無ければ,末っ子のノードにとしてコンテントノードを追加する.
Definition at line 1302 of file txml.c.
References add_xml_content(), cat_s2Buffer, XML_CONTENT_NODE, and XML_NAME_NODE.
01303 { 01304 tList* pp; 01305 01306 if (xml==NULL || content==NULL) return NULL; 01307 if (xml->ldat.id!=XML_NAME_NODE) return NULL; 01308 01309 pp = xml->next; 01310 while (pp!=NULL && pp->ldat.id!=XML_CONTENT_NODE) pp = pp->ysis; 01311 01312 if (pp==NULL) { 01313 pp = add_xml_content(xml, content); 01314 } 01315 else { 01316 if (pp->ldat.key.vldsz!=0) cat_s2Buffer(" ", &(pp->ldat.key)); 01317 cat_s2Buffer(content, &(pp->ldat.key)); 01318 } 01319 01320 return pp; 01321 }
int check_match_xml(tXML* tp, tXML* tr)
XMLツリー tpが XMLツリー trと同じかどうかを検査する.
tp のトップと tr のトップはキー値が一致している必要がある.一致していなければ,同じパターンは無しとする.
ただし,tr->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).
一度見つけた tpの枝の最後のノードに対しては ctrlを TREE_ALREADY_FOUND_NODE を設定するので,続けてチェックする 場合などは ctrl をクリアする必要がある.
もし同じツリーパターンがある場合,trの各ノードの altpには,一番最初に見つかった対応する tpの各ノードへのポインタが格納される.
tp | 検索対象のツリー | |
tr | 検索パターンのツリー |
TRUE | tp中に trと同じいツリーパターンが存在する. | |
TRUE | trの各ノードの altpには,一番最初に見つかった対応する tpの各ノードへのポインタが格納される. | |
FALSE | tpに同じツリーパターンは無い.この場合,trの altpの値は不定となる. |
Definition at line 2941 of file txml.c.
References check_match_xml(), cmp_sisters_xml(), FALSE, find_tList_end(), TREE_ALREADY_FOUND_NODE, and TRUE.
Referenced by check_match_xml(), find_match_xml(), and find_match_xml_endlist_rcsv().
02942 { 02943 int ret; 02944 tXML* te; 02945 tXML* ts; 02946 02947 tXML* tt; 02948 tXML* ta; 02949 tXML* tb; 02950 02951 if (tp==NULL || tr==NULL) return FALSE; 02952 02953 te = find_tList_end(tr); 02954 02955 ts = tp; 02956 while (ts!=NULL) { 02957 tt = cmp_sisters_xml(ts, tr); // その階層で trと全て一致している部分があるかを確認 02958 if (tt==NULL) return FALSE; // 一致していなければ,FALSE 02959 02960 ta = tt; // 比べられるツリー 02961 tb = tr; // 比べるパターン 02962 ret = TRUE; 02963 while (tb!=NULL && ret) { 02964 if (tb->next==NULL) ret = TRUE; 02965 // ->ta, ->tb->tx: FALSE 02966 else if (tb->next!=NULL && ta->next==NULL) ret = FALSE; 02967 // ->ta->xa, ->tb->xb: xaとxbをチェック 02968 else ret = check_match_xml(ta->next, tb->next); 02969 02970 ta = ta->ysis; 02971 tb = tb->ysis; 02972 } 02973 02974 if (ret) { 02975 if (tr==te) tt->ctrl = TREE_ALREADY_FOUND_NODE; 02976 return TRUE; 02977 } 02978 02979 ts = tt->ysis; 02980 } 02981 02982 return FALSE; 02983 }
void close_xml | ( | tXML * | pp | ) |
void close_xml(tXML* pp)
パースエラーを起こしたツリーを強制的に正常化する.
pp | 正常化するツリーへのポインタ. |
Definition at line 845 of file txml.c.
References adjust_tTree_depth(), close_xml(), JBXL_XML_NODE_CLOSED, JBXL_XML_NODE_EMPTY, JBXL_XML_PARSED, and XML_ANCHOR_NODE.
Referenced by close_xml().
00846 { 00847 if (pp!=NULL) { 00848 00849 // アンカー 00850 if (pp->ldat.id==XML_ANCHOR_NODE) { 00851 pp->state = JBXL_XML_PARSED; 00852 pp->depth = -1; 00853 if (pp->next!=NULL) { 00854 pp->next->depth = 0; 00855 adjust_tTree_depth(pp->next); 00856 close_xml(pp->next); 00857 } 00858 return; 00859 } 00860 00861 while(pp->esis!=NULL) pp = pp->esis; 00862 do { 00863 if (pp->next==NULL) pp->state = JBXL_XML_NODE_EMPTY; 00864 // 00865 if (pp->state!=JBXL_XML_NODE_EMPTY) pp->state = JBXL_XML_NODE_CLOSED; 00866 //if (pp->ldat.lst!=NULL) { 00867 // if ((pp->ldat.lst)->state!=JBXL_XML_NODE_EMPTY) (pp->ldat.lst)->state = JBXL_XML_NODE_CLOSED; 00868 //} 00869 // 00870 if (pp->next!=NULL) close_xml(pp->next); 00871 00872 pp = pp->ysis; 00873 } while(pp!=NULL); 00874 } 00875 00876 return; 00877 }
tXML* cmp_sisters_xml(tXML* tp, tXML* tr)
XMLノード tpの姉妹ノードが trの姉妹ノードと同じ XMLノードまたはコンテントであるかを比較する.
ただし,tr->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).
また tp->ctrl が TREE_ALREADY_FOUND_NODE の場合は,常に一致しない.
もし同じノードパターンがある場合,trの各ノードの altpには対応する tpの各ノードへのポインタが格納される.
また tpの各ノードの ctrlには TREE_ALREADY_FOUND_NODE が設定される.
tp | 比べる姉妹ノードの長女ノード | |
tr | 探す姉妹ノードパターンの長女ノード |
NULL | tpに同じ姉妹パターンは無い. |
Definition at line 3019 of file txml.c.
References TREE_ALREADY_FOUND_NODE, TREE_NOCMP_COPY_NODE, and TREE_NOCMP_NODE.
Referenced by check_match_xml().
03020 { 03021 tXML* ta; 03022 tXML* tb = NULL; 03023 tXML* ts; 03024 03025 ts = tp; 03026 while (ts!=NULL){ 03027 ta = ts; 03028 tb = tr; 03029 while (ta!=NULL && tb!=NULL) { 03030 // 一致しない場合 break 03031 if (ta->ctrl==TREE_ALREADY_FOUND_NODE) break; 03032 if (tb->ctrl!=TREE_NOCMP_NODE && tb->ctrl!=TREE_NOCMP_COPY_NODE) { 03033 if ((ta->ldat).key.buf!=NULL && (tb->ldat).key.buf!=NULL) { 03034 if (ta->ldat.id!=tb->ldat.id || strcmp((char*)((ta->ldat).key.buf), (char*)((tb->ldat).key.buf))) break; 03035 } 03036 else break; 03037 } 03038 03039 // ta と tb は一致 03040 tb->altp = ta; 03041 ta = ta->ysis; 03042 tb = tb->ysis; 03043 } 03044 03045 // ts と tr は完全に一致 03046 if (tb==NULL) return ts; 03047 03048 ts = ts->ysis; 03049 } 03050 03051 return NULL; 03052 }
tXML* dup_merge_xml(tXML* pp, tXML* tp)
XMLツリー ppの直下に(Yunger Sister として)XMLツリー tpを複製する.
pp | 複製されたツリーのトップとなるノード | |
tp | 複製するツリー |
Definition at line 1593 of file txml.c.
References dup_merge_tTree(), and XML_ANCHOR_NODE.
01594 { 01595 if (tp==NULL) return pp; 01596 01597 if (tp->ldat.id==XML_ANCHOR_NODE) { 01598 if (tp->next!=NULL) tp = tp->next; 01599 else return pp; 01600 } 01601 01602 pp = dup_merge_tTree(pp, tp); 01603 01604 /* 01605 tXML* pt; 01606 if (pp->ldat.id!=XML_ANCHOR_NODE) { 01607 pt = new_tTree_node(); 01608 pt->ldat.id = XML_ANCHOR_NODE; 01609 pt->depth = -1; 01610 add_tTree(pt, pp); 01611 close_xml(pt); 01612 return pt; 01613 } 01614 */ 01615 01616 return pp; 01617 }
int find_match_xml(tXML* pp, tXML* pt)
ツリー pp内で ツリー ptと同じパターンの枝を探す.姉妹ツリーも検索するので注意.
同じパターンの探索では キー値のみを比較し,ノード値は比較しない.
ただし,pt->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).
もし同じツリーパターンがある場合,trの各ノードの altpには,一番最初に見つかった対応する ppの各ノードへ のポインタが格納される.
check_match_xml() との違い.
pp | 検索対象のツリー.姉妹ツリーも検索する. | |
pt | 検索パターンのツリー |
TRUE | pp中に pt同じいツリーパターンが存在する. ptの各ノードの altpには,一番最初に見つかった対応する ppの各ノードへのポインタが格納される. | |
FALSE | ppに同じツリーパターンは無い.この場合,ptのaltpの値は不定となる. |
Definition at line 2794 of file txml.c.
References check_match_xml(), clear_tTree_ctrl(), FALSE, find_match_xml(), and TRUE.
Referenced by find_match_xml(), get_xml_content(), get_xml_node(), and set_xml_end_node().
02795 { 02796 int ret; 02797 tXML* pm; 02798 02799 pm = pp; 02800 while(pp!=NULL) { 02801 ret = check_match_xml(pp, pt); 02802 if (ret) return TRUE; 02803 02804 if (pp->next!=NULL) { 02805 ret = find_match_xml(pp->next, pt); 02806 if (ret) { 02807 clear_tTree_ctrl(pm); 02808 return TRUE; 02809 } 02810 } 02811 pp = pp->ysis; 02812 } 02813 02814 return FALSE; 02815 }
tXML* find_match_xml_end_node(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptの最後のノードに対応する pp内のノードへのポインタを返す.
ノードは ノード名,コンテントのどちらでも可.
pp | 検索対象のXML | |
pt | 検索パターンの文字列. |
Definition at line 2897 of file txml.c.
References clear_tTree_ctrl(), find_match_tTree(), and find_xml_end.
02898 { 02899 int ret; 02900 tXML* tt = NULL; 02901 tXML* pm; 02902 02903 if (pp==NULL || pt==NULL) return NULL; 02904 02905 pm = pp; 02906 ret = find_match_tTree(pp, pt); 02907 if (ret) { 02908 tt = find_xml_end(pt); 02909 if (tt!=NULL) { 02910 tt = tt->altp; 02911 } 02912 } 02913 02914 clear_tTree_ctrl(pm); 02915 02916 return tt; 02917 }
tXML* find_match_xml_endlist(tXML* pp, tXML* pt)
ツリー pp内で ツリー ptと同じパターンの枝を全て探して,その枝のptの最後のノードに対応するノードの情報をリストにして返す.
該当ノードへのポインタは 返された各リストのaltp が保持している.
比較では キー値のみを比較し,ノード値は比較しない.
また,pt->ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE のノードは比べない(常に一致とする).
pp | 検索対象のツリー.姉妹ツリーも検索する. | |
pt | 検索パターンのツリー |
Definition at line 2833 of file txml.c.
References clear_tTree_ctrl(), find_match_xml_endlist_rcsv(), and find_xml_end.
Referenced by get_xml_content_list(), and get_xml_node_list().
02834 { 02835 tXML* te; 02836 tList* lp; 02837 02838 te = find_xml_end(pt); 02839 while(pp->esis!=NULL) pp = pp->esis; 02840 02841 lp = find_match_xml_endlist_rcsv(pp, pt, te); 02842 if (lp!=NULL) clear_tTree_ctrl(pp); 02843 02844 return lp; 02845 }
tList* find_match_xml_endlist_rcsv(tXML* pp, tXML* pt, tXML* te)
find_match_xml_endlist() の補助関数
Definition at line 2855 of file txml.c.
References check_match_xml(), clear_tTree_ctrl(), find_match_xml_endlist_rcsv(), insert_tList(), and new_tList_node().
Referenced by find_match_xml_endlist(), and find_match_xml_endlist_rcsv().
02856 { 02857 tList* lt = NULL; 02858 tList* lp = NULL; 02859 02860 while(pp!=NULL) { 02861 int ret = check_match_xml(pp, pt); 02862 if (ret && te->altp!=NULL) { 02863 tList* lm = new_tList_node(); 02864 lm->altp = te->altp; 02865 lt = insert_tList(lt, lm); 02866 if (lp==NULL) lp = lt; 02867 te->altp = NULL; 02868 } 02869 02870 if (pp->next!=NULL) { 02871 tList* lm = find_match_xml_endlist_rcsv(pp->next, pt, te); 02872 if (lm!=NULL) { 02873 lt = insert_tList(lt, lm); 02874 if (lp==NULL) lp = lt; 02875 clear_tTree_ctrl(pp->next); 02876 } 02877 } 02878 02879 if (!ret) pp = pp->ysis; // 見つかった場合はもう一度.見つからなかった場合へ次へ. 02880 } 02881 02882 return lp; 02883 }
char* get_first_xml_nodename | ( | tXML * | xml | ) |
char* get_first_xml_nodename(tXML* xml)
XMLツリーの最初のノードの名前を返す.
xml | XMLツリー |
Definition at line 1449 of file txml.c.
References XML_ANCHOR_NODE, and XML_NAME_NODE.
01450 { 01451 char* nodename = NULL; 01452 01453 if (xml==NULL) return NULL; 01454 tList* lp = xml; 01455 if (lp->ldat.id==XML_ANCHOR_NODE) lp = lp->next; 01456 01457 while (lp!=NULL) { 01458 if (lp->ldat.id==XML_NAME_NODE) { 01459 if (lp->ldat.key.buf!=NULL) { 01460 nodename = (char*)lp->ldat.key.buf; 01461 break; 01462 } 01463 } 01464 lp = lp->ysis; 01465 } 01466 return nodename; 01467 }
Buffer get_node_content(tXML* tp, const char* name, int no)
tp 中のXMLデータから no番目のノード '<name>node_content</name>' のnode_contentのコピーを得る.
ノードが複数のコンテントを持つ場合は,最初のコンテントのみを返す.
tp | 探索を行う XMLデータ | |
name | ノード名 | |
no | 一致した物の中で何番目の物を返すか指定する.1から数える. |
Definition at line 3071 of file txml.c.
References dup_Buffer(), init_Buffer(), strncmp_tTree(), and XML_CONTENT_NODE.
Referenced by get_node_integer(), and return_exist_node().
03072 { 03073 Buffer content; 03074 tXML* tt; 03075 03076 content = init_Buffer(); 03077 if (tp==NULL || name==NULL) return content; 03078 03079 if (no<=0) no = 1; 03080 tt = strncmp_tTree(tp, name, 0, no); 03081 if (tt!=NULL) { 03082 if (tt->next!=NULL) { 03083 tt = tt->next; 03084 while (tt!=NULL && tt->ldat.id!=XML_CONTENT_NODE) tt = tt->ysis; 03085 if (tt==NULL) return content; 03086 content = dup_Buffer(tt->ldat.key); 03087 } 03088 } 03089 03090 return content; 03091 }
int get_node_integer | ( | tXML * | tp, | |
const char * | name, | |||
int | no | |||
) |
int get_node_integer(tXML* tp, const char* name, int no)
tp中のXMLデータから no番目のノード '<node_name>node_content(整数)</node_name>' の node_content(整数)を得る.
Definition at line 3100 of file txml.c.
References Buffer::buf, free_Buffer(), and get_node_content().
03101 { 03102 int ret; 03103 Buffer content; 03104 03105 content = get_node_content(tp, name, no); 03106 03107 if (content.buf==NULL) ret = 0; 03108 else ret = atoi((const char*)content.buf); 03109 free_Buffer(&content); 03110 03111 return ret; 03112 }
tList* get_xml_attr(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードのノード属性値へのリストを返す.
pp の姉妹ツリーも検索するので注意.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.
pp | 検索対象のツリー.姉妹ツリーも検索する. | |
pt | 検索するパターン |
Definition at line 2131 of file txml.c.
References get_xml_node().
Referenced by get_xml_attr_bystr().
02132 { 02133 tList* lp = NULL; 02134 tXML* tt; 02135 02136 if (pp==NULL || pt==NULL) return NULL; 02137 02138 tt = get_xml_node(pp, pt); 02139 if (tt!=NULL) lp = tt->ldat.lst; 02140 return lp; 02141 }
tList* get_xml_attr_bystr(tXML* pp, const char* str)
get_xml_attr(tXML* pp, tXML* pt) の _bystr バージョン
Definition at line 2452 of file txml.c.
References del_xml, get_xml_attr(), and xml_parse().
02453 { 02454 tXML* tx; 02455 tList* tt; 02456 02457 if (pp==NULL || str==NULL) return NULL; 02458 02459 tx = xml_parse((char*)str); 02460 tt = get_xml_attr(pp, tx); 02461 del_xml(&tx); 02462 return tt; 02463 }
char* get_xml_char_attr(tXML* pp, tXML* pt, const char* attr)
get_xml_node() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない.
Definition at line 2150 of file txml.c.
References get_xml_node(), and xml_get_node_attr().
02151 { 02152 char* ret = NULL; 02153 if (pp==NULL || pt==NULL || attr==NULL) return ret; 02154 02155 tXML* node = get_xml_node(pp, pt); 02156 if (node!=NULL) ret = xml_get_node_attr(node, attr); 02157 return ret; 02158 }
char* get_xml_char_attr_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | attr | |||
) |
char* get_xml_char_attr_bystr(tXML* pp, const char* str, const char* attr)
get_xml_char_attr() の _bystr バージョン.
get_xml_node_bystr() で検索したノードから,属性値 attrの値を char*型で取り出す.free() してはいけない.
Definition at line 2473 of file txml.c.
References get_xml_node_bystr(), and xml_get_node_attr().
02474 { 02475 char* ret = NULL; 02476 if (pp==NULL || str==NULL || attr==NULL) return ret; 02477 02478 tXML* node = get_xml_node_bystr(pp, str); 02479 if (node!=NULL) ret = xml_get_node_attr(node, attr); 02480 return ret; 02481 }
int get_xml_char_content(tXML* pp, tXML* pt)
get_xml_content() を使用し,XML コンテンツの内容を char*型で返す.free() してはいけない
Definition at line 2106 of file txml.c.
References get_xml_content().
02107 { 02108 char* ret = NULL; 02109 02110 tXML* node = get_xml_content(pp, pt); 02111 if (node!=NULL) ret = (char*)(node->ldat.key.buf); 02112 return ret; 02113 }
char* get_xml_char_content_bystr | ( | tXML * | pp, | |
const char * | str | |||
) |
char* get_xml_char_content_bystr(tXML* pp, const char* str);
get_xml_char_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を char*型で返す.
free() してはいけない.
Definition at line 2416 of file txml.c.
References get_xml_content_bystr().
Referenced by llsd_xml_get_content_bin(), and llsd_xml_get_content_str().
02417 { 02418 char* ret = NULL; 02419 02420 tXML* node = get_xml_content_bystr(pp, str); 02421 if (node!=NULL) ret = (char*)(node->ldat.key.buf); 02422 return ret; 02423 }
tXML* get_xml_content(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードのコンテントへのポインタを返す.
pp の姉妹ツリーも検索するので注意.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
これらのノードは必ず一致する.
返ってきた tXML* は free() してはいけない.
pp | 検索対象のXMLツリー.姉妹ツリーも検索する. | |
pt | 検索するパターン |
pp pt A --> B --> M C --> M --> Y --> C --> M --> X --> Y --> Z --> N
Definition at line 1982 of file txml.c.
References add_xml_content(), clear_tTree_ctrl(), del_xml, find_match_xml(), find_xml_end, TREE_NOCMP_NODE, and XML_ANCHOR_NODE.
Referenced by get_xml_char_content(), get_xml_content_bystr(), get_xml_double_content(), get_xml_float_content(), get_xml_int_content(), replace_xml_content(), and set_xml_content().
01983 { 01984 int fnd; 01985 tXML* tt = NULL; 01986 tXML* pm; 01987 tXML* dm; 01988 01989 if (pp==NULL || pt==NULL) return NULL; 01990 01991 pm = pp; 01992 if (pp->ldat.id==XML_ANCHOR_NODE) { 01993 if (pp->next!=NULL) pp = pp->next; 01994 else return NULL; 01995 } 01996 if (pt->ldat.id==XML_ANCHOR_NODE) { 01997 if (pt->next!=NULL) pt = pt->next; 01998 else return NULL; 01999 } 02000 02001 tt = find_xml_end(pt); 02002 if (tt==NULL) return NULL; 02003 dm = add_xml_content(tt, (char*)"DUMMY"); 02004 if (dm==NULL) return NULL; 02005 dm->ctrl = TREE_NOCMP_NODE; 02006 02007 while(pp->esis!=NULL) pp = pp->esis; 02008 02009 fnd = find_match_xml(pp, pt); 02010 if (fnd) tt = dm->altp; 02011 else tt = NULL; 02012 02013 del_xml(&dm); 02014 clear_tTree_ctrl(pm); 02015 02016 return tt; 02017 }
tXML* get_xml_content_bystr(tXML* pp, const char* str)
get_xml_content(tXML* pp, tXML* pt) の _bystr バージョン
Definition at line 2343 of file txml.c.
References del_xml, FALSE, get_xml_content(), and xml_parse().
Referenced by get_xml_char_content_bystr(), get_xml_double_content_bystr(), get_xml_float_content_bystr(), and get_xml_int_content_bystr().
02344 { 02345 tXML* tx; 02346 tXML* tt; 02347 02348 if (pp==NULL || str==NULL) return FALSE; 02349 02350 tx = xml_parse((char*)str); 02351 tt = get_xml_content(pp, tx); 02352 del_xml(&tx); 02353 return tt; 02354 }
tList* get_xml_content_list(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードの コンテントへのポインタをリストに格納して返す.ポインタはリストの altpに格納される.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
これらのノードは必ず一致する.
pp | 検索対象のツリー | |
pt | 検索するパターン |
Definition at line 2637 of file txml.c.
References add_xml_content(), del_xml, find_match_xml_endlist(), find_xml_end, TREE_NOCMP_NODE, and XML_ANCHOR_NODE.
Referenced by get_xml_content_list_bystr(), and set_xml_content_list().
02638 { 02639 tList* lp; 02640 tList* dm; 02641 02642 if (pp==NULL || pt==NULL) return NULL; 02643 02644 if (pp->ldat.id==XML_ANCHOR_NODE) { 02645 if (pp->next!=NULL) pp = pp->next; 02646 else return NULL; 02647 } 02648 if (pt->ldat.id==XML_ANCHOR_NODE) { 02649 if (pt->next!=NULL) pt = pt->next; 02650 else return NULL; 02651 } 02652 02653 dm = find_xml_end(pt); 02654 if (dm==NULL) return NULL; 02655 dm = add_xml_content(dm, (char*)"DUMMY"); 02656 if (dm==NULL) return NULL; 02657 dm->ctrl = TREE_NOCMP_NODE; 02658 02659 lp = find_match_xml_endlist(pp, pt); 02660 del_xml(&dm); 02661 02662 return lp; 02663 }
tList* get_xml_conetnt_list_bystr(tXML* pp, const char* str)
get_xml_conetnt_list_bystr() の _bystr バージョン.
Definition at line 2729 of file txml.c.
References del_xml, get_xml_content_list(), and xml_parse().
02730 { 02731 tXML* tx; 02732 tList* tt; 02733 02734 if (pp==NULL || str==NULL) return NULL; 02735 02736 tx = xml_parse((char*)str); 02737 tt = get_xml_content_list(pp, tx); 02738 del_xml(&tx); 02739 02740 return tt; 02741 }
double get_xml_double_attr(tXML* pp, tXML* pt, const char* attr)
get_xml_node() で検索したノードから,属性値 attrの値を double型で取り出す.
値は " " で括られていても良い.
Definition at line 2196 of file txml.c.
References Buffer::buf, free_Buffer(), get_xml_node(), make_Buffer_bystr, and xml_get_node_attr().
02197 { 02198 double ret = 0.0; 02199 if (pp==NULL || pt==NULL || attr==NULL) return ret; 02200 02201 tXML* node = get_xml_node(pp, pt); 02202 if (node!=NULL) { 02203 char* val = xml_get_node_attr(node, attr); 02204 if (val!=NULL) { 02205 Buffer buf = make_Buffer_bystr(val); 02206 char* ptr = (char*)buf.buf; 02207 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0'; 02208 if (ptr[0]=='"') ptr++; 02209 ret = atof(ptr); 02210 free_Buffer(&buf); 02211 } 02212 } 02213 return ret; 02214 }
double get_xml_double_attr_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | attr | |||
) |
double get_xml_double_attr_bystr(tXML* pp, const char* str, const char* attr)
get_xml_double_attr() の _bystr バージョン.
get_xml_node_bystr() で検索したノードから,属性値 attrの値を double型で取り出す.
値は クォーテーションで括られていても良い.
Definition at line 2521 of file txml.c.
References Buffer::buf, free_Buffer(), get_xml_node_bystr(), make_Buffer_bystr, and xml_get_node_attr().
02522 { 02523 double ret = 0.0; 02524 if (pp==NULL || str==NULL || attr==NULL) return ret; 02525 02526 tXML* node = get_xml_node_bystr(pp, str); 02527 if (node!=NULL) { 02528 char* val = xml_get_node_attr(node, attr); 02529 if (val!=NULL) { 02530 Buffer buf = make_Buffer_bystr(val); 02531 char* ptr = (char*)buf.buf; 02532 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0'; 02533 if (ptr[0]=='"') ptr++; 02534 ret = atof(ptr); 02535 free_Buffer(&buf); 02536 } 02537 } 02538 return ret; 02539 }
double get_xml_double_content(tXML* pp, tXML* pt)
get_xml_content() を使用し,XML コンテンツの内容を double型で返す.
Definition at line 2090 of file txml.c.
References get_xml_content().
02091 { 02092 double ret = 0.0; 02093 02094 tXML* node = get_xml_content(pp, pt); 02095 if (node!=NULL) ret = atof((char*)(node->ldat.key.buf)); 02096 return ret; 02097 }
double get_xml_double_content_bystr | ( | tXML * | pp, | |
const char * | str | |||
) |
double get_xml_double_content_bystr(tXML* pp, const char* str);
get_xml_double_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を double型で返す.
Definition at line 2398 of file txml.c.
References get_xml_content_bystr().
Referenced by llsd_xml_get_content_real().
02399 { 02400 double ret = 0.0; 02401 02402 tXML* node = get_xml_content_bystr(pp, str); 02403 if (node!=NULL) ret = atof((char*)(node->ldat.key.buf)); 02404 return ret; 02405 }
float get_xml_float_content(tXML* pp, tXML* pt)
get_xml_content() を使用し,XML コンテンツの内容を float型で返す.
Definition at line 2074 of file txml.c.
References get_xml_content().
02075 { 02076 float ret = 0.0; 02077 02078 tXML* node = get_xml_content(pp, pt); 02079 if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf)); 02080 return ret; 02081 }
float get_xml_float_content_bystr | ( | tXML * | pp, | |
const char * | str | |||
) |
float get_xml_float_content_bystr(tXML* pp, const char* str)
get_xml_float_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content_bystr() を使用し,XML コンテンツの内容を float型で返す.
Definition at line 2381 of file txml.c.
References get_xml_content_bystr().
02382 { 02383 float ret = 0.0; 02384 02385 tXML* node = get_xml_content_bystr(pp, str); 02386 if (node!=NULL) ret = (float)atof((char*)(node->ldat.key.buf)); 02387 return ret; 02388 }
int get_xml_int_attr(tXML* pp, tXML* pt, const char* attr)
get_xml_node() で検索したノードから,属性値 attrの値を int型で取り出す.
値は " " で括られていても良い.
Definition at line 2168 of file txml.c.
References Buffer::buf, free_Buffer(), get_xml_node(), make_Buffer_bystr, and xml_get_node_attr().
02169 { 02170 int ret = 0; 02171 if (pp==NULL || pt==NULL || attr==NULL) return ret; 02172 02173 tXML* node = get_xml_node(pp, pt); 02174 if (node!=NULL) { 02175 char* val = xml_get_node_attr(node, attr); 02176 if (val!=NULL) { 02177 Buffer buf = make_Buffer_bystr(val); 02178 char* ptr = (char*)buf.buf; 02179 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0'; 02180 if (ptr[0]=='"') ptr++; 02181 ret = atoi(ptr); 02182 free_Buffer(&buf); 02183 } 02184 } 02185 return ret; 02186 }
int get_xml_int_attr_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | attr | |||
) |
int get_xml_int_attr_bystr(tXML* pp, const char* str, const char* attr)
get_xml_int_attr() の _bystr バージョン.
get_xml_node_bystr() で検索したノードから,属性値 attrの値を int型で取り出す.
値は " " で括られていても良い.
Definition at line 2492 of file txml.c.
References Buffer::buf, free_Buffer(), get_xml_node_bystr(), make_Buffer_bystr, and xml_get_node_attr().
02493 { 02494 int ret = 0; 02495 if (pp==NULL || str==NULL || attr==NULL) return ret; 02496 02497 tXML* node = get_xml_node_bystr(pp, str); 02498 if (node!=NULL) { 02499 char* val = xml_get_node_attr(node, attr); 02500 if (val!=NULL) { 02501 Buffer buf = make_Buffer_bystr(val); 02502 char* ptr = (char*)buf.buf; 02503 if (ptr[strlen(ptr)-1]=='"') ptr[strlen(ptr)-1] = '\0'; 02504 if (ptr[0]=='"') ptr++; 02505 ret = atoi(ptr); 02506 free_Buffer(&buf); 02507 } 02508 } 02509 return ret; 02510 }
int get_xml_int_content(tXML* pp, tXML* pt)
get_xml_content() を使用し,XML コンテンツの内容を int型で返す.
Definition at line 2058 of file txml.c.
References get_xml_content().
02059 { 02060 int ret = 0; 02061 02062 tXML* node = get_xml_content(pp, pt); 02063 if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf)); 02064 return ret; 02065 }
int get_xml_int_content_bystr | ( | tXML * | pp, | |
const char * | str | |||
) |
int get_xml_int_content_bystr(tXML* pp, const char* str)
get_xml_int_content(tXML* pp, tXML* pt) の _bystr バージョン.
get_xml_content()_bystr を使用し,XML コンテンツの内容を int型で返す.
Definition at line 2364 of file txml.c.
References get_xml_content_bystr().
Referenced by llsd_xml_get_content_int().
02365 { 02366 int ret = 0; 02367 02368 tXML* node = get_xml_content_bystr(pp, str); 02369 if (node!=NULL) ret = atoi((char*)(node->ldat.key.buf)); 02370 return ret; 02371 }
tXML* get_xml_node(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノードに対応したノードへのポインタを返す.
pp の姉妹ツリーも検索するので注意.
また,pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_NODE となっているノードは比較されない.
返ってきた tXML* は free() してはいけない.
pp | 検索対象のXMLツリー.姉妹ツリーも検索する. | |
pt | 検索するパターン |
pp pt A --> B --> M C --> M --> X --> C --> M --> X --> Y --> Z --> N
Definition at line 1835 of file txml.c.
References clear_tTree_ctrl(), FALSE, find_match_xml(), find_xml_end, and XML_ANCHOR_NODE.
Referenced by get_xml_attr(), get_xml_char_attr(), get_xml_double_attr(), get_xml_int_attr(), get_xml_node_bystr(), set_xml_attr(), and set_xml_node().
01836 { 01837 int fnd; 01838 tXML* tt; 01839 tXML* pm; 01840 01841 if (pp==NULL || pt==NULL) return NULL; 01842 01843 pm = pp; 01844 if (pp->ldat.id==XML_ANCHOR_NODE) { 01845 if (pp->next!=NULL) pp = pp->next; 01846 else return NULL; 01847 } 01848 if (pt->ldat.id==XML_ANCHOR_NODE) { 01849 if (pt->next!=NULL) pt = pt->next; 01850 else return NULL; 01851 } 01852 01853 tt = find_xml_end(pt); 01854 if (tt==NULL) return FALSE; 01855 01856 while(pp->esis!=NULL) pp = pp->esis; 01857 fnd = find_match_xml(pp, pt); 01858 if (fnd) tt = tt->altp; 01859 else tt = NULL; 01860 01861 clear_tTree_ctrl(pm); 01862 01863 return tt; 01864 }
tXML* get_xml_node_bystr(tXML* pp, const char* str)
get_xml_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition at line 2283 of file txml.c.
References del_xml, FALSE, get_xml_node(), and xml_parse().
Referenced by get_xml_char_attr_bystr(), get_xml_double_attr_bystr(), get_xml_int_attr_bystr(), and llsd_xml_contain_key().
02284 { 02285 tXML* tx; 02286 tXML* tt; 02287 02288 if (pp==NULL || str==NULL) return FALSE; 02289 02290 tx = xml_parse((char*)str); 02291 tt = get_xml_node(pp, tx); 02292 del_xml(&tx); 02293 return tt; 02294 }
tList* get_xml_node_list(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに一致した枝の,ptの最後のノードに対応するノードへの ポインタをリストに格納して返す.ポインタはリストの altpに格納される.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.
pp | 検索対象のツリー | |
pt | 検索するパターン |
Definition at line 2601 of file txml.c.
References find_match_xml_endlist(), and XML_ANCHOR_NODE.
Referenced by get_xml_node_list_bystr().
02602 { 02603 tList* lp; 02604 02605 if (pp==NULL || pt==NULL) return NULL; 02606 02607 if (pp->ldat.id==XML_ANCHOR_NODE) { 02608 if (pp->next!=NULL) pp = pp->next; 02609 else return NULL; 02610 } 02611 if (pt->ldat.id==XML_ANCHOR_NODE) { 02612 if (pt->next!=NULL) pt = pt->next; 02613 else return NULL; 02614 } 02615 02616 lp = find_match_xml_endlist(pp, pt); 02617 02618 return lp; 02619 }
tList* get_xml_node_list_bystr(tXML* pp, const char* str)
get_xml_node_list() の _bystr バージョン.
Definition at line 2708 of file txml.c.
References del_xml, get_xml_node_list(), and xml_parse().
02709 { 02710 tXML* tx; 02711 tList* tt; 02712 02713 if (pp==NULL || str==NULL) return NULL; 02714 02715 tx = xml_parse((char*)str); 02716 tt = get_xml_node_list(pp, tx); 02717 del_xml(&tx); 02718 02719 return tt; 02720 }
tXML* init_xml_doc | ( | void | ) |
tXML* init_xml_doc()
XML のドキュメントヘッダを作成する
Definition at line 1217 of file txml.c.
References xml_parse().
Referenced by xml_rpc_request_pack().
01218 { 01219 tXML* xml = xml_parse((char*)"<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 01220 return xml; 01221 }
tXML* insert_xml_node(tXML* xml, const char* name)
XMLツリーのxml の直下(姉妹の一番上:長子)にノード(属性は指定しない)を挿入する.
xml | 挿入するポイント | |
name | 挿入するノードの名前 |
Definition at line 1258 of file txml.c.
References insert_tTree_node_bystr(), JBXL_XML_NODE_EMPTY, and XML_NAME_NODE.
01259 { 01260 tList* pp; 01261 01262 if (xml==NULL || name==NULL) return NULL; 01263 01264 pp = insert_tTree_node_bystr(xml, XML_NAME_NODE, 0, name, NULL, NULL, 0); 01265 pp->state = JBXL_XML_NODE_EMPTY; 01266 if (pp->prev!=NULL) pp->prev->ldat.lv++; 01267 01268 return pp; 01269 }
int isnot_xml_name | ( | unsigned char * | pp | ) |
int isnot_xml_name(unsigned char* pp)
XML名として不適切かどうかを大まかに判断する.
かなりいい加減なので,FALSEだからといって,厳密にXML名として適切であるとは限らない.
pp | 検査する XML名へのポインタ |
TRUE | XML名として不適切 | |
FALSE | XML名として適切かもしれない |
Definition at line 818 of file txml.c.
Referenced by xml_parse_processing_node(), and xml_parse_start_node().
00819 { 00820 if (pp==NULL) return TRUE; 00821 if (*pp=='\0') return TRUE; 00822 00823 while (*pp!='\0') { 00824 if (*pp<=0x2c) return TRUE; // !"#$%&'()*+, 00825 if (*pp==0x2f) return TRUE; // / 00826 if (*pp>=0x3b && *pp<=0x40) return TRUE; // ;<=>?@ 00827 if (*pp>=0x5b && *pp<=0x5e) return TRUE; // [\]^ 00828 if (*pp==0x60) return TRUE; // ` 00829 if (*pp>=0x7b && *pp<=0x7f) return TRUE; // {|}~DEL 00830 pp++; 00831 } 00832 00833 return FALSE; 00834 }
Buffer make_xml_attr_bydouble | ( | const char * | name, | |
double | value | |||
) |
Buffer make_xml_attr_bydouble(const char* name, double value)
属性名 name, double型実数の属性値 value を持つ Buffer型変数を作成する.
Definition at line 1529 of file txml.c.
References cat_s2Buffer, dtostr_ts(), freeNull, and make_Buffer_bystr.
01530 { 01531 char* str = dtostr_ts(value); 01532 01533 Buffer buf = make_Buffer_bystr(name); 01534 cat_s2Buffer("=\"", &buf); 01535 cat_s2Buffer(str, &buf); 01536 cat_s2Buffer("\"", &buf); 01537 01538 freeNull(str); 01539 return buf; 01540 }
Buffer make_xml_attr_byfloat | ( | const char * | name, | |
float | value | |||
) |
Buffer make_xml_attr_byfloat(const char* name, float value)
属性名 name, float型実数の属性値 value を持つ Buffer型変数を作成する.
Definition at line 1510 of file txml.c.
References cat_s2Buffer, freeNull, ftostr_ts(), and make_Buffer_bystr.
01511 { 01512 char* str = ftostr_ts(value); 01513 01514 Buffer buf = make_Buffer_bystr(name); 01515 cat_s2Buffer("=\"", &buf); 01516 cat_s2Buffer(str, &buf); 01517 cat_s2Buffer("\"", &buf); 01518 01519 freeNull(str); 01520 return buf; 01521 }
Buffer make_xml_attr_byint | ( | const char * | name, | |
int | value | |||
) |
Buffer make_xml_attr_byint(const char* name, int value)
属性名 name, 整数の属性値 value を持つ Buffer型変数を作成する.
Definition at line 1491 of file txml.c.
References cat_s2Buffer, freeNull, itostr_ts(), and make_Buffer_bystr.
01492 { 01493 char* str = itostr_ts(value); 01494 01495 Buffer buf = make_Buffer_bystr(name); 01496 cat_s2Buffer("=\"", &buf); 01497 cat_s2Buffer(str, &buf); 01498 cat_s2Buffer("\"", &buf); 01499 01500 freeNull(str); 01501 return buf; 01502 }
Buffer make_xml_attr_bystr | ( | const char * | name, | |
const char * | value | |||
) |
Buffer make_xml_attr_bystr(const char* name, const char* value)
属性名 name, 文字列の属性値 value を持つ Buffer型変数を作成する.
Definition at line 1475 of file txml.c.
References cat_s2Buffer, and make_Buffer_bystr.
01476 { 01477 Buffer buf = make_Buffer_bystr(name); 01478 cat_s2Buffer("=\"", &buf); 01479 cat_s2Buffer(value, &buf); 01480 cat_s2Buffer("\"", &buf); 01481 01482 return buf; 01483 }
void print_sister_xml_tree | ( | FILE * | fp, | |
tXML * | pp, | |||
const char * | space | |||
) |
void print_sister_xml_tree(FILE* fp, tXML* pp, const char* space)
XMLツリーの表示.ppの姉妹ノードも出力する.
ポインタ pp以降の全てのノードのキー部のバッファを標準エラー出力に表示する.
表示:入れ子の深さ,ID, ノード状態, ノード名(ノード値),ノード属性の個数
fp | 出力するファイルへのポインタ.NULLの場合は stderr | |
pp | 表示を開始するノードへのポインタ.(姉妹ノードも出力する) | |
space | 出力の書式を揃えるための空白(インデント)を指定する.例 " " |
Definition at line 1766 of file txml.c.
References count_tList(), print_sister_xml_tree(), and XML_ANCHOR_NODE.
Referenced by print_sister_xml_tree(), and print_xml_tree().
01767 { 01768 if (fp==NULL) fp = stderr; 01769 01770 if (pp!=NULL) { 01771 if (pp->ldat.id==XML_ANCHOR_NODE) { 01772 if (pp->next!=NULL) pp = pp->next; 01773 } 01774 01775 while(pp->esis!=NULL) pp = pp->esis; 01776 // 01777 while(pp!=NULL) { 01778 int i; 01779 tList_data ld = pp->ldat; 01780 01781 if (pp->depth>=0) { 01782 if (pp->esis!=NULL || pp->depth>=0) fprintf(fp, "\n"); 01783 if (pp->depth>0) { 01784 for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space); 01785 //for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " "); 01786 fprintf(fp, "-> "); 01787 } 01788 } 01789 int num = count_tList((tList*)ld.lst); 01790 fprintf(fp, "%d: %d [%d] %s (%d)", pp->depth, ld.id, pp->state, ld.key.buf, num); 01791 01792 if (pp->next!=NULL) print_sister_xml_tree(fp, pp->next, space); 01793 01794 pp = pp->ysis; 01795 }; 01796 } 01797 else { 01798 fprintf(fp, "(XML is NULL)\n"); 01799 } 01800 fflush(fp); 01801 01802 return; 01803 }
void print_xml | ( | FILE * | fp, | |
tXML * | pp, | |||
int | mode | |||
) |
void print_xml(FILE* fp, tXML* pp, int mode)
XMLの表示(出力).
fp | 出力するファイルへのポインタ.NULLの場合は stderr | |
pp | 表示を開始するXMLノードへのポインタ. | |
mode | XML_ONELINE_FORMAT, XML_CRLF_FORMAT, XML_INDENT_FORMAT |
Definition at line 1658 of file txml.c.
References Buffer::buf, free_Buffer(), XML_ANCHOR_NODE, and xml_inverse_parse().
01659 { 01660 if (fp==NULL) fp = stderr; 01661 01662 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next; 01663 01664 if (pp!=NULL) { 01665 Buffer buf = xml_inverse_parse(pp, mode); 01666 if (buf.buf!=NULL) { 01667 fprintf(fp, "%s", buf.buf); 01668 free_Buffer(&buf); 01669 } 01670 else fprintf(fp, "(XML is NULL)\n"); 01671 } 01672 else { 01673 fprintf(fp, "(XML is NULL)\n"); 01674 } 01675 fflush(fp); 01676 01677 return; 01678 }
void print_xml_node | ( | FILE * | fp, | |
tXML * | pp | |||
) |
void print_xml_node(FILE* fp, tXML* pp)
XMLのノード情報を表示する.デバッグ用.
Definition at line 1687 of file txml.c.
References count_tList(), and XML_ANCHOR_NODE.
01688 { 01689 if (fp==NULL) fp = stderr; 01690 01691 //fprintf(fp, "深さ: ノード種別 [状態] ノード名 (属性数)\n"); 01692 01693 if (pp!=NULL) { 01694 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next; 01695 if (pp!=NULL) { 01696 int num = count_tList((tList*)pp->ldat.lst); 01697 fprintf(fp, "%d: %d [%d] %s (%d)", pp->depth, pp->ldat.id, pp->state, pp->ldat.key.buf, num); 01698 fprintf(fp, "\n"); 01699 } 01700 else { 01701 fprintf(fp, "(XML is ANCHOR only)\n"); 01702 } 01703 } 01704 else { 01705 fprintf(fp, "(XML is NULL)\n"); 01706 } 01707 fflush(fp); 01708 01709 return; 01710 }
void print_xml_tree | ( | FILE * | fp, | |
tXML * | pp, | |||
const char * | space | |||
) |
void print_xml_tree(FILE* fp, tXML* pp, const char* space)
XMLツリーをそのままツリー表示する.デバッグ用.
ポインタ pp以降の全てのノードのキー部のバッファを標準エラー出力に表示する.
表示:入れ子の深さ: ノード種別 [ノード状態] ノード名 (属性の個数)
fp | 出力するファイルへのポインタ.NULLの場合は stderr | |
pp | 表示を開始するノードへのポインタ. | |
space | 出力の書式を揃えるための空白(インデント)を指定する.例 " " |
Definition at line 1726 of file txml.c.
References print_sister_xml_tree(), and XML_ANCHOR_NODE.
01727 { 01728 int i; 01729 if (fp==NULL) fp = stderr; 01730 01731 //fprintf(fp, "深さ: ノード種別 [状態] ノード名 (属性数)\n"); 01732 01733 if (pp!=NULL) { 01734 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next; 01735 if (pp!=NULL) { 01736 for(i=0; i<pp->depth; i++) fprintf(fp, "%s", space); 01737 for(i=0; i<pp->depth-1; i++) fprintf(fp, "%s", " "); // for "-> " 01738 print_sister_xml_tree(fp, pp, space); 01739 fprintf(fp, "\n"); 01740 } 01741 else { 01742 fprintf(fp, "(XML is ANCHOR only)\n"); 01743 } 01744 } 01745 else { 01746 fprintf(fp, "(XML is NULL)\n"); 01747 } 01748 fflush(fp); 01749 01750 return; 01751 }
int replace_all_node_byid | ( | tXML * | pp, | |
const char * | src, | |||
const char * | dst, | |||
int | id | |||
) |
int replace_all_node_byid(tXML* pp, const char* src, const char* dst, int id)
XMLツリー pp内で ノードの種別が idである全てのノードの内容を srcから dstに書き換える.
pp | 置換対象のツリー | |
src | 置換対象のノードのコンテント(の一部でも可). NULL の場合は全ての文字列 | |
dst | 置換後のノードのコンテント | |
id | 置き換え対象のノードのID.id<0 なら全てのノード |
Definition at line 3249 of file txml.c.
References replace_all_node_byid_rcsv(), and XML_ANCHOR_NODE.
03250 { 03251 int n; 03252 03253 if (pp==NULL || dst==NULL) return 0; 03254 03255 if (pp->ldat.id==XML_ANCHOR_NODE) { 03256 if (pp->next!=NULL) pp = pp->next; 03257 else return 0; 03258 } 03259 while(pp->esis!=NULL) pp = pp->esis; 03260 03261 n = replace_all_node_byid_rcsv(pp, src, dst, id); 03262 03263 return n; 03264 }
int replace_all_node_byid_rcsv | ( | tXML * | pp, | |
const char * | src, | |||
const char * | dst, | |||
int | id | |||
) |
int replace_all_node_byid_rcsv(tXML* pp, const char* src, const char* dst, int id)
replace_all_node_byid() の補助関数
Definition at line 3273 of file txml.c.
References copy_s2Buffer, free_Buffer(), replace_all_node_byid_rcsv(), and replace_sBuffer_bystr().
Referenced by replace_all_node_byid(), and replace_all_node_byid_rcsv().
03274 { 03275 int n = 0; 03276 03277 while(pp!=NULL) { 03278 if (id<0 || pp->ldat.id==id) { 03279 if (src==NULL) { 03280 copy_s2Buffer(dst, &(pp->ldat.key)); 03281 n++; 03282 } 03283 else if (pp->ldat.key.buf!=NULL && strstr((const char*)pp->ldat.key.buf, src)!=NULL) { 03284 Buffer buf = replace_sBuffer_bystr(pp->ldat.key, src, dst); 03285 free_Buffer(&(pp->ldat.key)); 03286 pp->ldat.key = buf; 03287 n++; 03288 } 03289 } 03290 03291 if (pp->next!=NULL) n += replace_all_node_byid_rcsv(pp->next, src, dst, id); 03292 03293 pp = pp->ysis; 03294 } 03295 03296 return n; 03297 }
int replace_all_node_contents | ( | tXML * | pp, | |
const char * | name, | |||
const char * | src, | |||
const char * | dst | |||
) |
int replace_all_node_contents(tXML* pp, const char* name, const char* src, const char* dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテントを,srcから dstに書き換える.
一つのノードに複数のコンテントがある場合にも対応.
pp | 置換対象のツリー | |
name | 置き換えを行うノードのノード名.NULLの場合は全ての文字列. | |
src | 置換対象のノードのコンテント(の一部でも可). NULL の場合は全ての文字列 | |
dst | 置換後のノードのコンテント |
Definition at line 3175 of file txml.c.
References replace_all_node_contents_rcsv(), and XML_ANCHOR_NODE.
Referenced by replace_all_node_integer().
03176 { 03177 int n; 03178 03179 if (pp==NULL || dst==NULL) return 0; 03180 03181 if (pp->ldat.id==XML_ANCHOR_NODE) { 03182 if (pp->next!=NULL) pp = pp->next; 03183 else return 0; 03184 } 03185 while(pp->esis!=NULL) pp = pp->esis; 03186 03187 n = replace_all_node_contents_rcsv(pp, name, src, dst); 03188 03189 return n; 03190 }
int replace_all_node_contents_rcsv | ( | tXML * | pp, | |
const char * | name, | |||
const char * | src, | |||
const char * | dst | |||
) |
int replace_all_node_contents_rcsv(tXML* pp, const char* name, const char* src, const char* dst)
replace_all_node_content() の補助関数
Definition at line 3199 of file txml.c.
References copy_s2Buffer, free_Buffer(), replace_all_node_contents_rcsv(), replace_sBuffer_bystr(), XML_CONTENT_NODE, and XML_NAME_NODE.
Referenced by replace_all_node_contents(), and replace_all_node_contents_rcsv().
03200 { 03201 int n = 0; 03202 03203 while(pp!=NULL) { 03204 if (pp->ldat.key.buf!=NULL && pp->ldat.id==XML_NAME_NODE && pp->ldat.lv>0) { 03205 if (name==NULL || !strcmp(name, (const char*)(pp->ldat.key.buf))) { 03206 tXML* tt = pp->next; 03207 03208 // 複数のコンテント 03209 while (tt!=NULL) { 03210 if (tt->ldat.id==XML_CONTENT_NODE) { 03211 if (src==NULL) { 03212 copy_s2Buffer(dst, &(tt->ldat.key)); 03213 n++; 03214 } 03215 else if (tt->ldat.key.buf!=NULL && strstr((const char*)tt->ldat.key.buf, src)!=NULL) { 03216 Buffer buf = replace_sBuffer_bystr(tt->ldat.key, src, dst); 03217 free_Buffer(&(tt->ldat.key)); 03218 tt->ldat.key = buf; 03219 n++; 03220 } 03221 } 03222 tt = tt->ysis; 03223 } 03224 } 03225 } 03226 03227 if (pp->next!=NULL) n += replace_all_node_contents_rcsv(pp->next, name, src, dst); 03228 03229 pp = pp->ysis; 03230 } 03231 03232 return n; 03233 }
int replace_all_node_integer | ( | tXML * | tp, | |
const char * | name, | |||
int | src, | |||
int | dst | |||
) |
int replace_all_node_integer(tXML* tp, const char* name, int src, int dst)
XMLツリー pp内で ノード名が nameである全てのノードのコンテント(整数)を,srcから dstに書き換える.
tp | 置換対象のツリー | |
name | 置き換えを行うノードのノード名 | |
src | 置換対象のノードのコンテント(整数) | |
dst | 置換後のノードのコンテント(整数) |
Definition at line 3147 of file txml.c.
References replace_all_node_contents().
03148 { 03149 int n; 03150 char nums[20], numd[20]; 03151 03152 snprintf(nums, 10, "%d", src); 03153 snprintf(numd, 10, "%d", dst); 03154 03155 n = replace_all_node_contents(tp, name, nums, numd); 03156 03157 return n; 03158 }
int replace_xml_content(tXML* pp, tXML* pt, const char* src, const char* dst)
get_xml_content() を使用し,XMLキーの src部分を dstで書き換える.
Definition at line 2257 of file txml.c.
References Buffer::buf, FALSE, free_Buffer(), get_xml_content(), replace_sBuffer_bystr(), and TRUE.
Referenced by replace_xml_content_bystr().
02258 { 02259 tXML* tt; 02260 Buffer tg; 02261 02262 if (pp==NULL || pt==NULL || src==NULL || dst==NULL) return FALSE; 02263 02264 tt = get_xml_content(pp, pt); 02265 if (tt==NULL) return FALSE; 02266 02267 tg = replace_sBuffer_bystr(tt->ldat.key, src, dst); 02268 if (tg.buf==NULL) return FALSE; 02269 02270 free_Buffer(&(tt->ldat.key)); 02271 tt->ldat.key = tg; 02272 02273 return TRUE; 02274 }
int replace_xml_content_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | src, | |||
const char * | dst | |||
) |
int replace_xml_content_bystr(tXML*pp, const char* str, const char* src, const char* dst)
replace_xml_content() の _bystr バージョン.
Definition at line 2568 of file txml.c.
References del_xml, FALSE, replace_xml_content(), and xml_parse().
02569 { 02570 tXML* tx; 02571 int rt; 02572 02573 if (pp==NULL || src==NULL || src==NULL || dst==NULL) return FALSE; 02574 02575 tx = xml_parse((char*)str); 02576 rt = replace_xml_content(pp, tx, src, dst); 02577 del_xml(&tx); 02578 return rt; 02579 }
int return_exist_node(tXML* tp, const char* name, int no, Buffer* content)
bufの中に ノード '<name>content</name>' が存在するかどうかチェックする.
存在する場合はそのノードのコンテントのコピーを content に格納し,TRUE を返す.
Definition at line 3122 of file txml.c.
References Buffer::buf, FALSE, get_node_content(), and TRUE.
03123 { 03124 Buffer buf; 03125 03126 buf = get_node_content(tp, name, no); 03127 if (buf.buf==NULL) return FALSE; 03128 03129 if (content!=NULL) *content = buf; 03130 return TRUE; 03131 }
int set_xml_attr(tXML* pp, tXML* pt, tList* at)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードのノードの属性として atの値をコピーする.
pp の姉妹ツリーも検索するので注意.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.
pp | 検索対象のツリー.姉妹ツリーも検索する. | |
pt | 検索パターン | |
at | 設定する属性の格納されたリスト.ldat.key に属性名,ldat.val に属性値("",''付き) |
TRUE | 設定する枝を見つけた.正常に設置されたかどうかは不明. | |
FALSE | 設定する枝を見つけられなかった. |
Definition at line 2235 of file txml.c.
References del_all_tList(), dup_tList(), FALSE, get_xml_node(), and TRUE.
Referenced by set_xml_attr_bystr().
02236 { 02237 tXML* tt; 02238 02239 if (pp==NULL || pt==NULL || at==NULL) return FALSE; 02240 02241 tt = get_xml_node(pp, pt); 02242 if (tt!=NULL) { 02243 del_all_tList(&(tt->ldat.lst)); 02244 tt->ldat.lst = dup_tList(at); 02245 } 02246 else return FALSE; 02247 return TRUE; 02248 }
int set_xml_attr_bystr(tXML* pp, const char* str, tList* at)
set_xml_attr() の _bystr バージョン.
Definition at line 2548 of file txml.c.
References del_xml, FALSE, set_xml_attr(), and xml_parse().
02549 { 02550 tXML* tx; 02551 int rt; 02552 02553 if (pp==NULL || str==NULL || at==NULL) return FALSE; 02554 02555 tx = xml_parse((char*)str); 02556 rt = set_xml_attr(pp, tx, at); 02557 del_xml(&tx); 02558 return rt; 02559 }
int set_xml_content(tXML* pp, tXML* pt, const char* content)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後ノードに対応したのノードのコンテントを contentで置き換える.
pp の姉妹ツリーも検索するので注意.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは 比較されない.これらのノードは必ず一致する.
pp | 検索対象のツリー.姉妹ツリーも検索する. | |
pt | 検索パターン | |
content | ptの最後のノードに対応するノードにコピーするノード値. |
TRUE | 設定する枝を見つけた.正常に設定れたかどうかは不明. | |
FALSE | 設定する枝を見つけられなかった. |
Definition at line 2038 of file txml.c.
References copy_s2Buffer, FALSE, get_xml_content(), and TRUE.
Referenced by set_xml_content_bystr().
02039 { 02040 tXML* tt; 02041 02042 if (pp==NULL || pt==NULL || content==NULL) return FALSE; 02043 02044 tt = get_xml_content(pp, pt); 02045 if (tt==NULL) return FALSE; 02046 02047 copy_s2Buffer(content, &(tt->ldat.key)); 02048 return TRUE; 02049 }
int set_xml_content_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | val | |||
) |
int set_xml_content_bystr(tXML* pp, const char* str, const char* val)
set_xml_content(tXML* pp, tXML* pt, char* val) の _bystr バージョン
Definition at line 2432 of file txml.c.
References del_xml, FALSE, set_xml_content(), and xml_parse().
02433 { 02434 tXML* tx; 02435 int rt; 02436 02437 if (pp==NULL || str==NULL || val==NULL) return FALSE; 02438 02439 tx = xml_parse((char*)str); 02440 rt = set_xml_content(pp, tx, val); 02441 del_xml(&tx); 02442 return rt; 02443 }
int set_xml_content_list(tXML* pp, tXML* pt, const char* content)
get_xml_content_list() で検出したコンテントを, content で置き換える.
pp | 対象のXMLツリー | |
pt | 検索パターン | |
content | 書き換えのノード値 |
Definition at line 2678 of file txml.c.
References copy_s2Buffer, del_tList(), and get_xml_content_list().
Referenced by set_xml_content_list_bystr().
02679 { 02680 int num = 0; 02681 tList* lt; 02682 tList* lp; 02683 02684 if (pp==NULL || pt==NULL || content==NULL) return 0; 02685 02686 lp = lt = get_xml_content_list(pp, pt); 02687 if (lt==NULL) return 0; 02688 02689 while (lt!=NULL) { 02690 if (lt->altp!=NULL) { 02691 copy_s2Buffer(content, &(lt->altp->ldat.key)); 02692 num++; 02693 } 02694 lt = lt->next; 02695 } 02696 del_tList(&lp); 02697 02698 return num; 02699 }
int set_xml_content_list_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | content | |||
) |
int set_xml_content_list_bystr(tXML* pp, const char* str, const char* content)
set_xml_content_list_bystr() の _bystr バージョン.
Definition at line 2750 of file txml.c.
References del_xml, set_xml_content_list(), and xml_parse().
02751 { 02752 tXML* tx; 02753 int rt; 02754 02755 if (pp==NULL || str==NULL || content==NULL) return 0; 02756 02757 tx = xml_parse((char*)str); 02758 rt = set_xml_content_list(pp, tx, content); 02759 del_xml(&tx); 02760 02761 return rt; 02762 }
int set_xml_end_node(tXML* pp, tXML* pt)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の, ptの最後のノードに対応したノードに ptの最後のノードの値(含む属性)をコピーする.
pp の姉妹ツリーも検索するので注意.
ただし,ptの最後のノードに関しては比較されない(コピー用だから).
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっているノードは比較されない.
これらのノードは必ず一致する.コピーを行うのは ptの最後のノードのみである.
コピーする属性は ldat.id, ldat.lv, ldat.sz, ldat.key, ldat.val, ldat.ptr, ldat.lst
ldat.val, ldat.ptr, ldat.lst については,ptで値が設定されていなければ,置き換えを行わない.
pp | 検索対象のXMLツリー.姉妹ツリーも検索する. | |
pt | 検索パターン |
TRUE | 設定する枝を見つけた.正常に設定れたかどうかは不明. | |
FALSE | 設定する枝を見つけられなかった. |
Definition at line 1919 of file txml.c.
References adjust_tTree_depth(), clear_tTree_ctrl(), copy_tTree_byctrl(), FALSE, find_match_xml(), find_xml_end, TREE_NOCMP_COPY_NODE, and XML_ANCHOR_NODE.
Referenced by set_xml_end_node_bystr().
01920 { 01921 int ret; 01922 tXML* tt; 01923 tXML* pm; 01924 01925 01926 if (pp==NULL || pt==NULL) return FALSE; 01927 01928 pm = pp; 01929 if (pp->ldat.id==XML_ANCHOR_NODE) { 01930 if (pp->next!=NULL) pp = pp->next; 01931 else return FALSE; 01932 } 01933 if (pt->ldat.id==XML_ANCHOR_NODE) { 01934 if (pt->next!=NULL) pt = pt->next; 01935 else return FALSE; 01936 } 01937 01938 tt = find_xml_end(pt); 01939 if (tt==NULL) return FALSE; 01940 tt->ctrl = TREE_NOCMP_COPY_NODE; // 比べない.最後にコピー. 01941 01942 while(pp->esis!=NULL) pp = pp->esis; 01943 ret = find_match_xml(pp, pt); 01944 if (ret) { 01945 copy_tTree_byctrl(pt); 01946 adjust_tTree_depth(pp); 01947 } 01948 01949 clear_tTree_ctrl(pm); 01950 01951 return ret; 01952 }
int set_xml_end_node_bystr | ( | tXML * | pp, | |
const char * | str | |||
) |
int set_xml_end_node_bystr(tXML* pp, const char* str)
set_xml_end_node(tXML* pp, tXML* pt) の _bystr バージョン
Definition at line 2323 of file txml.c.
References del_xml, FALSE, set_xml_end_node(), and xml_parse().
02324 { 02325 tXML* tx; 02326 int rt; 02327 02328 if (pp==NULL || str==NULL) return FALSE; 02329 02330 tx = xml_parse((char*)str); 02331 rt = set_xml_end_node(pp, tx); 02332 del_xml(&tx); 02333 return rt; 02334 }
int set_xml_node(tXML* pp, tXML* pt, const char* name)
XMLツリー pp内で XMLツリー ptと同じパターンの枝を探し,ptに最初に一致した枝の,ptの最後のノード対応したノードにノード名をコピーする.
pp の姉妹ツリーも検索するので注意.
pt の中で ctrl が TREE_NOCMP_NODE または TREE_NOCMP_COPY_NODE となっている ノードは比較されない.
pp | 検索対象のXMLツリー.姉妹ツリーも検索する. | |
pt | 検索パターン | |
name | ptの最後のノードに対応するノードにコピーするノード名. |
TRUE | 設定するノードノードを見つけた.正常に設定れたかどうかは不明. | |
FALSE | 設定するノードノードを見つけられなかった. |
Definition at line 1883 of file txml.c.
References copy_s2Buffer, FALSE, get_xml_node(), and TRUE.
Referenced by set_xml_node_bystr().
01884 { 01885 tXML* tt; 01886 01887 if (pp==NULL || pt==NULL || name==NULL) return FALSE; 01888 01889 tt = get_xml_node(pp, pt); 01890 if (tt==NULL) return FALSE; 01891 01892 copy_s2Buffer(name, &(tt->ldat.key)); 01893 01894 return TRUE; 01895 }
int set_xml_node_bystr | ( | tXML * | pp, | |
const char * | str, | |||
const char * | val | |||
) |
int set_xml_node_bystr(tXML* pp, const char* str, const char* val)
set_xml_node(tXML* pp, tXML* pt, const char* val) の _bystr バージョン
Definition at line 2303 of file txml.c.
References del_xml, FALSE, set_xml_node(), and xml_parse().
02304 { 02305 tXML* tx; 02306 int rt; 02307 02308 if (pp==NULL || str==NULL || val==NULL) return FALSE; 02309 02310 tx = xml_parse((char*)str); 02311 rt = set_xml_node(pp, tx, val); 02312 del_xml(&tx); 02313 return rt; 02314 }
void xml_attr_to_Buffer(tList* pp, Buffer* buf)
リストに保存されたノードの属性をテキストへ戻す.
pp | 属性データが格納されたリストへのポインタ. | |
buf | 変換した属性データを格納する Buffer変数. |
Definition at line 1191 of file txml.c.
References cat_Buffer(), and cat_s2Buffer.
Referenced by xml_open_node_Buffer().
01192 { 01193 while (pp!=NULL) { 01194 cat_s2Buffer(" ", buf); 01195 cat_Buffer(&(pp->ldat.key), buf); 01196 01197 if (pp->ldat.val.buf!=NULL) { 01198 cat_s2Buffer("=", buf); 01199 cat_Buffer(&(pp->ldat.val), buf); 01200 } 01201 pp = pp->next; 01202 } 01203 }
void xml_close_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
ツリー中のXMLのクローズノードのデータを元の書式に戻して Bufferに格納する.
pp | XMLデータの格納されたツリーのノードへのポインタ | |
buf | 変換したXMLデータを格納した Buffer変数. | |
mode | 元のXMLへ戻す時の書式 | |
mode | XML_ONELINE_FORMAT 改行なしの一行にする. | |
mode | XML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する. | |
mode | XML_INDENT_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行する. | |
indent | インデントを付け始める深さ.modeが XML_INDENT_MODE のときのみ有効. |
Definition at line 1152 of file txml.c.
References cat_Buffer(), cat_s2Buffer, XML_CONTENT_NODE, XML_CRLF_FORMAT, XML_INDENT_FORMAT, and XML_NAME_NODE.
Referenced by xml_to_Buffer().
01153 { 01154 int i; 01155 01156 if (pp->ldat.id==XML_NAME_NODE) { 01157 if (pp->next!=NULL) { 01158 if (mode==XML_INDENT_FORMAT) { 01159 if (pp->next->ldat.id!=XML_CONTENT_NODE || pp->next->ysis!=NULL) { 01160 char* tabs = (char*)malloc(pp->depth-indent+1); 01161 if (tabs!=NULL) { 01162 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 01163 tabs[pp->depth-indent] = '\0'; 01164 cat_s2Buffer(tabs, buf); 01165 free(tabs); 01166 } 01167 } 01168 } 01169 01170 cat_s2Buffer("</", buf); 01171 cat_Buffer(&(pp->ldat.key), buf); 01172 cat_s2Buffer(">", buf); 01173 01174 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf); 01175 } 01176 } 01177 01178 return; 01179 }
char* xml_get_node_attr | ( | tXML * | node, | |
const char * | attr | |||
) |
char* xml_get_node_attr(tXML* node, const char* attr)
属性値を持つノードのポインタから,指定された属性値へのポインタを返す.free() してはいけない.
Definition at line 1566 of file txml.c.
References XML_NAME_NODE.
Referenced by get_xml_char_attr(), get_xml_char_attr_bystr(), get_xml_double_attr(), get_xml_double_attr_bystr(), get_xml_int_attr(), and get_xml_int_attr_bystr().
01567 { 01568 if (node==NULL) return NULL; 01569 01570 if (node->ldat.id==XML_NAME_NODE) { 01571 tList* lt = node->ldat.lst; 01572 while (lt!=NULL) { 01573 if (!strcmp((const char*)lt->ldat.key.buf, attr)) return (char*)(lt->ldat.val.buf); 01574 lt = lt->next; 01575 } 01576 } 01577 return NULL; 01578 }
char* xml_get_node_content | ( | tXML * | node | ) |
char* xml_get_node_content(tXML* node)
コンテントへのポインタを返す.free() してはいけない.
Definition at line 1549 of file txml.c.
References XML_CONTENT_NODE, and XML_NAME_NODE.
01550 { 01551 if (node==NULL || node->next==NULL) return NULL; 01552 01553 if (node->ldat.id==XML_NAME_NODE) { 01554 if (node->next->ldat.id==XML_CONTENT_NODE) return (char*)(node->next->ldat.key.buf); 01555 } 01556 return NULL; 01557 }
Buffer xml_inverse_parse(tXML* pp, int mode)
ppに格納された XMLデータを元の書式に戻して Bufferに格納する.xml_parse() の逆.
XML_CRLF_FORMAT, XML_INDENT_FORMAT でノード値がある場合は,値を囲むノードは改行しない.
pp | XMLデータの格納されたツリーへのポインタ | |
mode | 元のXMLへ戻す時の書式 | |
mode | XML_ONELINE_FORMAT 改行なしの一行にする. | |
mode | XML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する. | |
mode | XML_INDENT_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行 CR LF (0x0d,0x0a)する. |
Definition at line 900 of file txml.c.
References Buffer::buf, count_tTree(), init_Buffer(), LMDATA, make_Buffer(), XML_ANCHOR_NODE, and xml_to_Buffer().
Referenced by print_xml(), and xml_rpc_request_pack().
00901 { 00902 int cnt; 00903 Buffer buf; 00904 00905 buf = init_Buffer(); 00906 if (pp==NULL) return buf; 00907 if (pp->ldat.id==XML_ANCHOR_NODE) pp = pp->next; 00908 if (pp==NULL) return buf; 00909 00910 cnt = count_tTree(pp); 00911 buf = make_Buffer(cnt*LMDATA); 00912 if (buf.buf==NULL) return buf; 00913 00914 while (pp->esis!=NULL) pp = pp->esis; 00915 xml_to_Buffer(pp, &buf, mode, pp->depth); 00916 00917 return buf; 00918 }
tXML* xml_main_parse(tXML* xml, char* pp, int skip)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.
完全な XMLデータでなくても解釈できるところまでは解釈する.
パーサの内部的なメイン関数.ただし,ユーザが直接この関数を使用することは多分無い.
xml | XMLデータを格納するツリー構造体の先頭へのポインタ. | |
pp | XMLデータへのポインタ. | |
skip | 最初のデータ(タイトルなど)をスキップするか? TRUE or FLASE |
負数 | state エラーの場合は stateに 負数の値が入る. |
Definition at line 193 of file txml.c.
References add_tTree_node_bystr(), CHAR_CR, CHAR_LF, CHAR_TAB, freeNull, JBXL_XML_NODE_CLOSED, JBXL_XML_NODE_EMPTY, JBXL_XML_NODE_OPENED, JBXL_XML_PARSE_ERROR, JBXL_XML_SEQUENCE_ERROR, XML_COMMENT_NODE, XML_COMMENT_NODE_KEY, XML_CONTENT_NODE, XML_DATA_NODE, XML_DATA_NODE_KEY, XML_DOC_NODE, XML_NAME_NODE, xml_parse_attr(), xml_parse_comment_node(), xml_parse_content(), xml_parse_data_node(), xml_parse_end_node(), xml_parse_processing_node(), xml_parse_start_node(), and XML_PROCESS_NODE.
Referenced by xml_parse(), and xml_parse_seq().
00194 { 00195 int n, node_end; 00196 char* node_name = NULL; 00197 char* node_attr = NULL; 00198 char* value = NULL; 00199 00200 if (pp ==NULL) return xml; 00201 if (xml==NULL) return NULL; 00202 00203 if (skip) while (*pp!='\0' && *pp!='<') pp++; 00204 00205 while (*pp!='\0') { 00206 n = 1; 00207 00208 if (*pp=='<') { 00209 // End TAG </ > 00210 if (*(pp+1)=='/') { 00211 if (xml->state==JBXL_XML_NODE_OPENED) { 00212 n = xml_parse_end_node(pp, &node_name); 00213 if (n>0) { 00214 if (node_name!=NULL && xml->ldat.key.buf!=NULL) { 00215 if (!strcmp((const char*)node_name, (const char*)(xml->ldat.key.buf))) { 00216 if (xml->next!=NULL) { 00217 xml->state = JBXL_XML_NODE_CLOSED; 00218 } 00219 else { 00220 xml->state = JBXL_XML_NODE_EMPTY; 00221 } 00222 // 00223 if (xml->prev!=NULL) xml = xml->prev; 00224 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00225 } 00226 else n = xml->state = JBXL_XML_PARSE_ERROR; 00227 } 00228 else n = xml->state = JBXL_XML_PARSE_ERROR; 00229 } 00230 else xml->state = n; // エラー 00231 } 00232 else n = xml->state = JBXL_XML_PARSE_ERROR; 00233 } 00234 00235 // Comment TAG <!-- --> 00236 else if (!strncmp(pp+1, "!--", 3)) { 00237 n = xml_parse_comment_node(pp, &value); 00238 if (n>0) { 00239 xml = add_tTree_node_bystr(xml, XML_COMMENT_NODE, 0, (char*)XML_COMMENT_NODE_KEY, value, NULL, 0); 00240 xml->state = JBXL_XML_NODE_EMPTY; 00241 if (xml->prev!=NULL) xml = xml->prev; 00242 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00243 } 00244 } 00245 00246 // Data TAG <! > 00247 else if (*(pp+1)=='!') { 00248 n = xml_parse_data_node(pp, &value); 00249 if (n>0) { 00250 xml = add_tTree_node_bystr(xml, XML_DATA_NODE, 0, (char*)XML_DATA_NODE_KEY, value, NULL, 0); 00251 xml->state = JBXL_XML_NODE_EMPTY; 00252 if (xml->prev!=NULL) xml = xml->prev; 00253 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00254 } 00255 } 00256 00257 // Processing TAG <? ?> 00258 else if (*(pp+1)=='?') { 00259 n = xml_parse_processing_node(pp, &node_name, &node_attr); 00260 if (n>0) { 00261 if (!strncasecmp("xml", node_name, 3)) { 00262 tList* lp = xml_parse_attr(node_attr); 00263 xml = add_tTree_node_bystr(xml, XML_DOC_NODE, 0, node_name, NULL, NULL, 0); 00264 xml->ldat.lst = lp; 00265 } 00266 else { 00267 xml = add_tTree_node_bystr(xml, XML_PROCESS_NODE, 0, node_name, node_attr, NULL, 0); 00268 } 00269 xml->state = JBXL_XML_NODE_EMPTY; 00270 if (xml->prev!=NULL) xml = xml->prev; 00271 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00272 } 00273 } 00274 00275 // Start TAG < > 00276 else { 00277 n = xml_parse_start_node(pp, &node_name, &node_attr, &node_end); 00278 00279 if (n>0) { 00280 tList* lp = xml_parse_attr(node_attr); 00281 xml = add_tTree_node_bystr(xml, XML_NAME_NODE, 0, node_name, NULL, NULL, 0); 00282 xml->ldat.lst = lp; 00283 00284 if (node_end) { 00285 xml->state = JBXL_XML_NODE_EMPTY; 00286 if (xml->prev!=NULL) xml = xml->prev; 00287 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00288 } 00289 else { 00290 int m; 00291 xml->state = JBXL_XML_NODE_OPENED; 00292 // ノード値 00293 m = xml_parse_content(pp+n, &value); // 0 が返る可能性がある 00294 if (m>=0) { 00295 n += m; 00296 if (value!=NULL) { 00297 xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0); 00298 xml->state = JBXL_XML_NODE_CLOSED; 00299 if (xml->prev!=NULL) { 00300 xml = xml->prev; 00301 xml->ldat.lv++; 00302 } 00303 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00304 } 00305 } 00306 else n = xml->state = m; // エラー 00307 } 00308 } 00309 } 00310 00311 freeNull(node_name); 00312 freeNull(node_attr); 00313 freeNull(value); 00314 } 00315 00316 // Content (断片的に入力したXMLが content の途中で終わっている場合など) 00317 else { 00318 if (xml->state==JBXL_XML_NODE_OPENED) { 00319 n = xml_parse_content(pp, &value); 00320 if (n>0) { 00321 if (value!=NULL) { 00322 xml = add_tTree_node_bystr(xml, XML_CONTENT_NODE, 0, value, NULL, NULL, 0); 00323 xml->state = JBXL_XML_NODE_CLOSED; 00324 if (xml->prev!=NULL) { 00325 xml = xml->prev; 00326 xml->ldat.lv++; 00327 } 00328 else n = xml->state = JBXL_XML_SEQUENCE_ERROR; 00329 } 00330 } 00331 else n = xml->state = JBXL_XML_PARSE_ERROR; 00332 freeNull(value); 00333 } 00334 else n = xml->state = JBXL_XML_PARSE_ERROR; 00335 } 00336 00337 // エラー 00338 if (n<=0) return xml; 00339 00340 pp += n; 00341 while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) pp++; 00342 } 00343 00344 return xml; 00345 }
void xml_open_node_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
ツリー中のXMLのオープンノードのデータを元の書式に戻して Bufferに格納する.
pp | XMLデータの格納されたツリーのノードへのポインタ | |
buf | 変換したXMLデータを格納した Buffer変数. | |
mode | 元のXMLへ戻す時の書式 | |
mode | XML_ONELINE_FORMAT 改行なしの一行にする. | |
mode | XML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する. | |
mode | XML_INDENT_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行する. | |
indent | インデントを付け始める深さ.modeが XML_INDENT_MODE のときのみ有効. |
Definition at line 966 of file txml.c.
References Buffer::buf, cat_Buffer(), cat_s2Buffer, JBXL_XML_NODE_EMPTY, Buffer::vldsz, xml_attr_to_Buffer(), XML_COMMENT_NODE, XML_CONTENT_NODE, XML_CRLF_FORMAT, XML_DATA_NODE, XML_DOC_NODE, XML_INDENT_FORMAT, XML_NAME_NODE, and XML_PROCESS_NODE.
Referenced by xml_to_Buffer().
00967 { 00968 int i; 00969 00970 // Name TAG 00971 if (pp->ldat.id==XML_NAME_NODE) { 00972 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) { 00973 if (buf->vldsz>0 && buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf); 00974 } 00975 // 00976 if (mode==XML_INDENT_FORMAT) { 00977 char* tabs = (char*)malloc(pp->depth-indent+1); 00978 if (tabs!=NULL) { 00979 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 00980 tabs[pp->depth-indent] = '\0'; 00981 cat_s2Buffer(tabs, buf); 00982 free(tabs); 00983 } 00984 } 00985 00986 cat_s2Buffer("<", buf); 00987 cat_Buffer(&(pp->ldat.key), buf); 00988 if (pp->ldat.lst!=NULL) { 00989 xml_attr_to_Buffer(pp->ldat.lst, buf); 00990 } 00991 if (pp->next==NULL) { 00992 if (pp->state==JBXL_XML_NODE_EMPTY) { 00993 cat_s2Buffer(" />", buf); 00994 } 00995 else { 00996 cat_s2Buffer("></", buf); 00997 cat_Buffer(&(pp->ldat.key), buf); 00998 cat_s2Buffer(">", buf); 00999 } 01000 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) { 01001 cat_s2Buffer("\r\n", buf); 01002 } 01003 } 01004 else { 01005 cat_s2Buffer(">", buf); 01006 } 01007 } 01008 01009 // Content 01010 else if (pp->ldat.id==XML_CONTENT_NODE) { 01011 if (buf->buf[buf->vldsz-1]=='\n') { 01012 buf->buf[buf->vldsz-2] = '\0'; 01013 buf->vldsz -= 2; 01014 } 01015 // 01016 if (pp->esis!=NULL || pp->ysis!=NULL) { 01017 cat_s2Buffer("\r\n", buf); 01018 char* tabs = (char*)malloc(pp->depth-indent+1); 01019 if (tabs!=NULL) { 01020 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 01021 tabs[pp->depth-indent] = '\0'; 01022 cat_s2Buffer(tabs, buf); 01023 free(tabs); 01024 } 01025 } 01026 // 01027 cat_Buffer(&(pp->ldat.key), buf); 01028 // 01029 if (pp->esis!=NULL) cat_s2Buffer("\r\n", buf); 01030 } 01031 01032 // xml TAG 01033 else if (pp->ldat.id==XML_DOC_NODE) { 01034 if (mode==XML_INDENT_FORMAT) { 01035 char* tabs = (char*)malloc(pp->depth-indent+1); 01036 if (tabs!=NULL) { 01037 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 01038 tabs[pp->depth-indent] = '\0'; 01039 cat_s2Buffer(tabs, buf); 01040 free(tabs); 01041 } 01042 } 01043 01044 cat_s2Buffer("<?", buf); 01045 if (pp->ldat.key.buf!=NULL) { 01046 cat_Buffer(&(pp->ldat.key), buf); 01047 } 01048 if (pp->ldat.lst!=NULL) { 01049 xml_attr_to_Buffer(pp->ldat.lst, buf); 01050 } 01051 cat_s2Buffer("?>", buf); 01052 01053 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf); 01054 } 01055 01056 // Comment TAG 01057 else if (pp->ldat.id==XML_COMMENT_NODE) { 01058 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) { 01059 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf); 01060 } 01061 01062 if (mode==XML_INDENT_FORMAT) { 01063 char* tabs = (char*)malloc(pp->depth-indent+1); 01064 if (tabs!=NULL) { 01065 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 01066 tabs[pp->depth-indent] = '\0'; 01067 cat_s2Buffer(tabs, buf); 01068 free(tabs); 01069 } 01070 } 01071 01072 cat_s2Buffer("<!--", buf); 01073 if (pp->ldat.val.buf!=NULL) { 01074 cat_Buffer(&(pp->ldat.val), buf); 01075 } 01076 cat_s2Buffer("-->", buf); 01077 01078 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf); 01079 } 01080 01081 // Data TAG 01082 else if (pp->ldat.id==XML_DATA_NODE) { 01083 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) { 01084 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf); 01085 } 01086 // 01087 if (mode==XML_INDENT_FORMAT) { 01088 char* tabs = (char*)malloc(pp->depth-indent+1); 01089 if (tabs!=NULL) { 01090 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 01091 tabs[pp->depth-indent] = '\0'; 01092 cat_s2Buffer(tabs, buf); 01093 free(tabs); 01094 } 01095 } 01096 01097 cat_s2Buffer("<!", buf); 01098 if (pp->ldat.val.buf!=NULL) { 01099 cat_Buffer(&(pp->ldat.val), buf); 01100 } 01101 cat_s2Buffer(">", buf); 01102 01103 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf); 01104 } 01105 01106 // Processing TAG 01107 else if (pp->ldat.id==XML_PROCESS_NODE) { 01108 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) { 01109 if (buf->buf[buf->vldsz-1]!='\n') cat_s2Buffer("\r\n", buf); 01110 } 01111 // 01112 if (mode==XML_INDENT_FORMAT) { 01113 char* tabs = (char*)malloc(pp->depth-indent+1); 01114 if (tabs!=NULL) { 01115 for (i=indent; i<pp->depth; i++) tabs[i-indent] = '\t'; 01116 tabs[pp->depth-indent] = '\0'; 01117 cat_s2Buffer(tabs, buf); 01118 free(tabs); 01119 } 01120 } 01121 01122 cat_s2Buffer("<?", buf); 01123 if (pp->ldat.key.buf!=NULL) { 01124 cat_Buffer(&(pp->ldat.key), buf); 01125 } 01126 if (pp->ldat.lst!=NULL) { 01127 xml_attr_to_Buffer(pp->ldat.lst, buf); 01128 } 01129 cat_s2Buffer(" ?>", buf); 01130 01131 if (mode==XML_INDENT_FORMAT || mode==XML_CRLF_FORMAT) cat_s2Buffer("\r\n", buf); 01132 } 01133 01134 return; 01135 }
tXML* xml_parse | ( | char * | pp | ) |
tXML* xml_parse(char* pp)
文字列のXMLデータを解釈して,tXMLのツリーを生成する.
pp | 文字列の XMLデータへのポインタ. |
負数 | エラーを起こした場合 stateに JBXL_XML_PARSED以外の値(0以下)が入る. |
Definition at line 49 of file txml.c.
References JBXL_STATE_ANCHOR, JBXL_XML_DEFAULT_STATE, JBXL_XML_MULTI_ROOT, JBXL_XML_NOT_CLOSED, JBXL_XML_PARSED, new_xml_node, TRUE, XML_ANCHOR_NODE, xml_main_parse(), and XML_NAME_NODE.
Referenced by get_xml_attr_bystr(), get_xml_content_bystr(), get_xml_content_list_bystr(), get_xml_node_bystr(), get_xml_node_list_bystr(), init_xml_doc(), replace_xml_content_bystr(), set_xml_attr_bystr(), set_xml_content_bystr(), set_xml_content_list_bystr(), set_xml_end_node_bystr(), set_xml_node_bystr(), and xml_parse_file().
00050 { 00051 tXML* xml; 00052 tXML* node; 00053 00054 xml = new_xml_node(); // アンカー 00055 xml->ldat.id = XML_ANCHOR_NODE; 00056 xml->state = JBXL_STATE_ANCHOR; 00057 xml->depth = -1; 00058 00059 // パース 00060 node = xml_main_parse(xml, pp, TRUE); 00061 if (node->state<0) return xml; 00062 00063 // 元に戻ったか? 00064 if (xml==node) { 00065 xml->state = JBXL_XML_PARSED; 00066 } 00067 else { 00068 xml->state = JBXL_XML_NOT_CLOSED; 00069 } 00070 00071 // XML rootの数 00072 if (xml->next!=NULL) { 00073 int n = 0; 00074 node = xml->next; 00075 while(node!=NULL) { 00076 if (node->ldat.id==XML_NAME_NODE) n++; 00077 node = node->ysis; 00078 } 00079 if (n!=1) xml->state = JBXL_XML_MULTI_ROOT; 00080 } 00081 else xml->state = JBXL_XML_DEFAULT_STATE; 00082 00083 return xml; 00084 }
tList* xml_parse_attr | ( | char * | pp | ) |
tList* xml_parse_attr(char* pp)
XMLのノード属性を解釈して,リスト(tList)にする. 解釈する形式は AAA="GGG" xxxx="1234"
pp | テキストで保存されている属性へのポインタ. |
JBXL_XML_PARSE_ERR | state パースエラーの場合は state に JBXL_XML_PARSE_ERROR が設定される. | |
JBXL_XML_NODE_CLOSED | state 正常に終了した場合は JBXL_XML_NODE_CLOSED が設定される. |
Definition at line 566 of file txml.c.
References add_tList_node_str, JBXL_XML_NODE_CLOSED, and JBXL_XML_PARSE_ERROR.
Referenced by add_xml_attr(), and xml_main_parse().
00567 { 00568 int sz; 00569 char* nm; 00570 char* vl; 00571 char* pt; 00572 char qt; 00573 tList* lp = NULL; 00574 tList* lt = NULL; 00575 00576 // 作業メモリの確保 00577 if (pp==NULL) return NULL; 00578 sz = (int)strlen((const char*)pp) + 1; 00579 nm = (char*)malloc(sz); 00580 if (nm==NULL) return NULL; 00581 vl = (char*)malloc(sz); 00582 if (vl==NULL) { 00583 free(nm); 00584 return NULL; 00585 } 00586 00587 // Parse for AAA="BBB" CCC="DDDD" 00588 while (*pp==' ' && *pp!='\0') pp++; 00589 while (*pp!='\0') { 00590 pt = pp; 00591 while (*pt!='=' && *pt!='\0') pt++; 00592 if (*pt=='\0') { 00593 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR; 00594 break; 00595 } 00596 00597 sz = (int)(pt - pp); 00598 memcpy(nm, pp, (size_t)sz); 00599 nm[sz] = '\0'; 00600 00601 pt++; 00602 if (*pt!='"' && *pt!='\'') { 00603 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR; 00604 break; 00605 } 00606 else qt = *pt; 00607 00608 pt++; 00609 pp = pt; 00610 while(*pt!=qt && *pt!='\0') pt++; 00611 if (*pt=='\0') { 00612 if (lt!=NULL) lt->state = JBXL_XML_PARSE_ERROR; 00613 break; 00614 } 00615 00616 sz = (int)(pt - pp); 00617 memcpy(vl+1, pp, (size_t)sz); 00618 vl[0] = qt; 00619 vl[sz+1] = qt; 00620 vl[sz+2] = '\0'; 00621 00622 lp = add_tList_node_str(lp, nm, vl); 00623 if (lt==NULL) lt = lp; 00624 pp = pt + 1; 00625 00626 if (*pp!=' ' && *pp!='\0') { 00627 lt->state = JBXL_XML_PARSE_ERROR; 00628 break; 00629 } 00630 while (*pp==' ' && *pp!='\0') pp++; 00631 } 00632 00633 // 00634 free(nm); 00635 free(vl); 00636 00637 if (lt!=NULL) { 00638 if (lt->state!=JBXL_XML_PARSE_ERROR) lt->state = JBXL_XML_NODE_CLOSED; 00639 } 00640 return lt; 00641 }
int xml_parse_comment_node | ( | char * | pp, | |
char ** | comment | |||
) |
int xml_parse_comment_node(char* pp, char** comment)
XMLのコメントノードを処理する.処理できるノードの型は ''
xml_parse_data_node() に先立って適用させる必要がある.
pp | ノードへのポインタ.'<' を指すポインタ. | |
[out] | *comment | コメント部分がそのまま格納される.要 free |
1以上 | ノード全体の長さ.0 が返ることは無い. | |
JBXL_XML_PARSE_ERROR | パースエラー | |
JBXL_MALLOC_ERROR | メモリエラー |
Definition at line 736 of file txml.c.
References JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and skip_chars().
Referenced by xml_main_parse().
00737 { 00738 int nn, mm; 00739 char* pt; 00740 00741 *comment = NULL; 00742 if (pp==NULL) return JBXL_XML_PARSE_ERROR; 00743 if (strncmp(pp, "<!--", 4)) return JBXL_XML_PARSE_ERROR; 00744 00745 pt = pp = pp + 4; 00746 pt = skip_chars(pt, ">"); 00747 if (pt==NULL) return JBXL_XML_PARSE_ERROR; 00748 00749 pt -= 2; 00750 if (strncmp(pt, "-->", 3)) return JBXL_XML_PARSE_ERROR; 00751 00752 nn = mm = (int)(pt - pp); 00753 if (mm==0) return JBXL_XML_PARSE_ERROR; 00754 00755 nn += 4; 00756 *comment = (char*)malloc((size_t)(mm+1)); 00757 if (*comment==NULL) return JBXL_MALLOC_ERROR; 00758 memcpy(*comment, pp, mm); 00759 (*comment)[mm] = '\0'; 00760 //PRINT_MESG("COMMENT-> %s %d\n", *comment, (int)strlen(*comment)); 00761 00762 return nn + 3; 00763 }
int xml_parse_content | ( | char * | pp, | |
char ** | content | |||
) |
int xml_parse_content(char* pp, char** content)
XMLのコンテントを処理する. <node_name attr="node_attr">content</node_name>
値の前後の空白,TAB, LF, CRは削除される.
pp | コンテントの先頭へのポインタ.Start Tagの '>' の次を指すポインタ. | |
[in] | *content | コンテントを格納するポインタ.コンテントがない場合は NULLでも可. |
[out] | *content | コンテントが格納される.前後の 空白, TAB, LF, CRは削除されている.要 free |
0以上 | ノード値部の全体の長さ.0 が返る可能性もある(<x></x>の場合) | |
JBXL_XML_PARSE_ERROR | パースエラー | |
JBXL_MALLOC_ERROR | メモリエラー |
Definition at line 519 of file txml.c.
References CHAR_CR, CHAR_LF, CHAR_TAB, JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and pack_head_tail_char().
Referenced by xml_main_parse().
00520 { 00521 int nn=0, mm; 00522 char* pt; 00523 char* work; 00524 00525 if (pp==NULL || content==NULL) return JBXL_XML_PARSE_ERROR; 00526 *content = NULL; 00527 00528 while (*pp==' ' || *pp==CHAR_TAB || *pp==CHAR_LF || *pp==CHAR_CR) { 00529 pp++; 00530 nn++; 00531 } 00532 if (*pp=='<') return nn; // <node>< 00533 00534 pt = pp; 00535 while (*pt!='<' && *pt!='\0') pt++; 00536 00537 mm = (int)(pt - pp); 00538 if (mm==0) return nn; 00539 nn += mm; 00540 00541 work = (char*)malloc((size_t)(mm+1)); 00542 if (work==NULL) return JBXL_MALLOC_ERROR; 00543 memcpy(work, pp, mm); 00544 work[mm] = '\0'; 00545 00546 *content = pack_head_tail_char(work, ' '); 00547 free(work); 00548 //PRINT_MESG("VALUE --> %s %d\n", *content, (int)strlen(*content)); 00549 00550 return nn; 00551 }
int xml_parse_data_node | ( | char * | pp, | |
char ** | data | |||
) |
int xml_parse_data_node(char* pp, char** data)
XMLのデータノード(その他エレメントノードなど)を処理する.処理できるノードの型は <!data>
データ部分は解釈せずに,そのまま dataに格納される.
pp | ノードへのポインタ.'<' を指すポインタ. | |
[out] | *data | データ部分がそのまま格納される.要 free |
1以上 | ノード全体の長さ.0 が返ることは無い. | |
JBXL_XML_PARSE_ERROR | パースエラー | |
JBXL_MALLOC_ERROR | メモリエラー |
Definition at line 780 of file txml.c.
References JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and skip_chars().
Referenced by xml_main_parse().
00781 { 00782 int nn, mm; 00783 char* pt; 00784 00785 *data = NULL; 00786 if (pp==NULL) return JBXL_XML_PARSE_ERROR; 00787 if (strncmp(pp, "<!", 2)) return JBXL_XML_PARSE_ERROR; 00788 00789 pt = pp = pp + 2; 00790 pt = skip_chars(pt, ">"); 00791 if (pt==NULL) return JBXL_XML_PARSE_ERROR; 00792 00793 nn = mm = (int)(pt - pp); 00794 if (mm==0) return JBXL_XML_PARSE_ERROR; 00795 00796 nn += 2; 00797 *data = (char*)malloc((size_t)(mm+1)); 00798 if (*data==NULL) return JBXL_MALLOC_ERROR; 00799 memcpy(*data, pp, mm); 00800 (*data)[mm] = '\0'; 00801 //PRINT_MESG("DATA ---> %s %d\n", *data, (int)strlen(*data)); 00802 00803 return nn + 1; 00804 }
int xml_parse_end_node | ( | char * | pp, | |
char ** | node_name | |||
) |
int xml_parse_end_node(char* pp, char** node_name)
XMLの終了ノードを処理する.処理できるノードの型は </node_name>
pp | ノードへのポインタ.'<' を指すポインタ. | |
[out] | *node_name | ノードの名前を格納するポインタ.要 free |
1以上 | ノード全体の長さ.0 が返ることは無い. | |
JBXL_XML_PARSE_ERROR | パースエラー | |
JBXL_MALLOC_ERROR | メモリエラー |
Definition at line 473 of file txml.c.
References JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, pack_head_tail_char(), and skip_chars().
Referenced by xml_main_parse().
00474 { 00475 int nn, mm; 00476 char* pt; 00477 char* work; 00478 00479 if (pp==NULL) return JBXL_XML_PARSE_ERROR; 00480 *node_name = NULL; 00481 00482 if (strncmp(pp ,"</", 2)) return JBXL_XML_PARSE_ERROR; 00483 00484 pt = pp = pp + 2; 00485 pt = skip_chars(pt, ">"); 00486 if (pt==NULL) return JBXL_XML_PARSE_ERROR; 00487 00488 nn = mm = (int)(pt - pp); 00489 if (mm==0) return JBXL_XML_PARSE_ERROR; 00490 00491 nn += 2; 00492 work = (char*)malloc((size_t)(mm+1)); 00493 if (work==NULL) return JBXL_MALLOC_ERROR; 00494 memcpy(work, pp, mm); 00495 work[mm] = '\0'; 00496 *node_name = pack_head_tail_char(work, ' '); 00497 free(work); 00498 //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name)); 00499 00500 return nn + 1; 00501 }
tXML* xml_parse_file | ( | const char * | fn | ) |
tXML* xml_parse_file(const char* fn)
ファイルから読み込んでパースする.
fn | 読み込むファイル名 |
Definition at line 96 of file txml.c.
References Buffer::buf, free_Buffer(), read_Buffer_file(), and xml_parse().
Referenced by save_http_xml(), and save_https_xml().
00097 { 00098 tXML* xml = NULL; 00099 Buffer buf; 00100 00101 buf = read_Buffer_file(fn); 00102 if (buf.buf!=NULL) { 00103 xml = xml_parse((char*)(buf.buf)); 00104 free_Buffer(&buf); 00105 } 00106 00107 return xml; 00108 }
int xml_parse_processing_node | ( | char * | pp, | |
char ** | node_name, | |||
char ** | node_attr | |||
) |
int xml_parse_processing_node(char* pp, char** node_name, char** node_attr)
XMLのプロセッシングノードを処理する.処理できるノードの型は <?processing?>
プロセッシング部分は解釈せずに,そのまま node_name, node_attrに格納される.
pp | ノードへのポインタ.'<' を指すポインタ. | |
[out] | *node_name | プロセッシングの名前部分が格納される.要free |
[out] | *node_attr | プロセッシングの属性部分が格納される.要free |
1以上 | ノード全体の長さ.0 が返ることは無い. | |
JBXL_XML_PARSE_ERROR | パースエラー | |
JBXL_MALLOC_ERROR | メモリエラー |
Definition at line 659 of file txml.c.
References CHAR_CR, CHAR_LF, CHAR_TAB, freeNull, isnot_xml_name(), JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, and skip_chars().
Referenced by xml_main_parse().
00660 { 00661 int nn, mm; 00662 char* pt; 00663 00664 *node_name = NULL; 00665 *node_attr = NULL; 00666 00667 if (pp==NULL) return JBXL_XML_PARSE_ERROR; 00668 if (strncmp(pp, "<?", 2)) return JBXL_XML_PARSE_ERROR; 00669 00670 pt = pp = pp + 2; 00671 pt = skip_chars(pt, " ?"); 00672 if (pt==NULL) return JBXL_XML_PARSE_ERROR; 00673 00674 nn = mm = (int)(pt - pp); 00675 if (mm==0) return JBXL_XML_PARSE_ERROR; 00676 00677 nn += 2; 00678 *node_name = (char*)malloc((size_t)(mm + 1)); 00679 if (*node_name==NULL) return JBXL_MALLOC_ERROR; 00680 memcpy(*node_name, pp, mm); 00681 (*node_name)[mm] = '\0'; 00682 00683 if (isnot_xml_name((unsigned char*)*node_name)) return JBXL_XML_PARSE_ERROR; 00684 00685 // for attribute 00686 if (*pt==' ') { 00687 pp = pt = pt + 1; 00688 while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++; 00689 nn += (int)(pt - pp) + 1; 00690 00691 pp = pt; 00692 pt = skip_chars(pt, "?"); 00693 if (pt==NULL) { 00694 freeNull(*node_name); 00695 return JBXL_XML_PARSE_ERROR; 00696 } 00697 00698 mm = (int)(pt - pp); 00699 if (mm>0) { 00700 *node_attr = (char*)malloc((size_t)(mm + 1)); 00701 if (*node_attr==NULL) { 00702 freeNull(*node_name); 00703 return JBXL_MALLOC_ERROR; 00704 } 00705 memcpy(*node_attr, pp, mm); 00706 (*node_attr)[mm] = '\0'; 00707 nn += mm; 00708 //PRINT_MESG("ATTR --> %s %d\n", *node_attr, (int)strlen(*node_attr)); 00709 } 00710 } 00711 00712 if (strncmp(pt, "?>", 2)) { 00713 freeNull(*node_name); 00714 freeNull(*node_attr); 00715 return JBXL_XML_PARSE_ERROR; 00716 } 00717 00718 return nn + 2; 00719 }
tXML* xml_parse_seq(tXML* xml, char* pp)
部分的な XMLデータを解釈して,tXMLのツリー構造に格納する.
完全な XMLデータでなくても解釈できるところまでは解釈する.
xmlが NULLの場合は自動的にツリーを作る.
断片的に XMLデータを入力する場合に使用する.
xml | XMLデータを格納するツリー構造体の先頭へのポインタ.ツリーの途中のノードでも可 | |
pp | XMLデータへのポインタ. |
tXML* xml; xml = xml_parse_seq(NULL, "<A aaa=\"YYY\"><B>"); xml = xml_parse_seq(xml->altp, "<Z zzz=\"99 9\"/><M>MM</M></B><C><M><X>XX</X><YY yyy=\"888\">XX"); xml = xml_parse_seq(xml->altp, "YY</YY>MM</M><C bbb=\"777\" xxx=\"000i\" xxxx=\"000\" >"); xml = xml_parse_seq(xml->altp, "<X></X><M><X></X>YY<Y>oooo"); xml = xml_parse_seq(xml->altp, "</Y></M></C></C></A>"); xml = xml_parse_seq(xml->altp, "<M>"); close_xml(xml);
Definition at line 138 of file txml.c.
References FALSE, find_xml_top, JBXL_NORMAL, JBXL_XML_DEFAULT_STATE, JBXL_XML_MULTI_ROOT, JBXL_XML_PARSED, new_tTree_anchor_node(), TRUE, xml_main_parse(), and XML_NAME_NODE.
00139 { 00140 int skip = FALSE; 00141 tXML* node; 00142 00143 if (xml==NULL) { 00144 xml = new_tTree_anchor_node(); 00145 //xml->ldat.id = XML_ANCHOR_NODE; 00146 //xml->depth = -1; 00147 skip = TRUE; 00148 } 00149 else { 00150 tXML* top = find_xml_top(xml); 00151 if (top==xml) top->state = JBXL_XML_DEFAULT_STATE; 00152 } 00153 00154 node = xml_main_parse(xml, pp, skip); 00155 xml = find_xml_top(xml); 00156 xml->altp = node; 00157 00158 if (xml!=node) return xml; 00159 00160 if (node->state==JBXL_NORMAL) xml->state = JBXL_XML_PARSED; 00161 else xml->state = node->state; 00162 00163 if (xml->next!=NULL) { 00164 int n = 0; 00165 node = xml->next; 00166 while(node!=NULL) { 00167 if (node->ldat.id==XML_NAME_NODE) n++; 00168 node = node->ysis; 00169 } 00170 if (n!=1) xml->state = JBXL_XML_MULTI_ROOT; 00171 } 00172 else xml->state = JBXL_XML_DEFAULT_STATE; 00173 00174 return xml; 00175 }
int xml_parse_start_node | ( | char * | pp, | |
char ** | node_name, | |||
char ** | node_attr, | |||
int * | node_end | |||
) |
int xml_parse_start_node(char* pp, char** node_name, char** node_attr, int* node_end)
XMLの開始ノードを処理する.処理できるノードの型は
<node_name attr1="value1" attr2="value2"> <node_name attr1="value1" attr2="value2" />
pp | ノードへのポインタ.'<' を指すポインタ. | |
[out] | *node_name | ノードの名前を格納するポインタ.要 free |
[out] | *node_attr | ノードの属性部分を格納するポインタ.処理(解釈)は行われない.要 free |
[out] | *node_end | ノードが単独で閉じている場合(Empty Tag)は TRUE, そうでない場合は FALSEが格納される.要 free |
1以上 | ノード全体の長さ.0 が返ることは無い. | |
JBXL_XML_PARSE_ERROR | パースエラー | |
JBXL_MALLOC_ERROR | メモリエラー | |
JBXL_ARGS_ERROR | 引数エラー |
Definition at line 375 of file txml.c.
References CHAR_CR, CHAR_LF, CHAR_TAB, FALSE, freeNull, isnot_xml_name(), JBXL_ARGS_ERROR, JBXL_MALLOC_ERROR, JBXL_XML_PARSE_ERROR, skip_chars(), and TRUE.
Referenced by xml_main_parse().
00376 { 00377 int nn, mm; 00378 char* pt; 00379 00380 if (node_name==NULL || node_attr==NULL || node_end==NULL) return JBXL_ARGS_ERROR; 00381 *node_end = FALSE; 00382 *node_name = NULL; 00383 *node_attr = NULL; 00384 00385 if (*pp!='<') return JBXL_XML_PARSE_ERROR; 00386 pt = pp = pp + 1; 00387 pt = skip_chars(pt, " />"); 00388 if (pt==NULL) return JBXL_XML_PARSE_ERROR; 00389 00390 nn = mm = (int)(pt - pp); 00391 if (mm==0) return JBXL_XML_PARSE_ERROR; 00392 00393 nn = nn + 1; 00394 *node_name = (char*)malloc((size_t)(mm + 1)); 00395 if (*node_name==NULL) return JBXL_MALLOC_ERROR; 00396 memcpy(*node_name, pp, mm); 00397 (*node_name)[mm] = '\0'; 00398 //PRINT_MESG("START --> %s %d\n", *node_name, (int)strlen(*node_name)); 00399 00400 if (isnot_xml_name((unsigned char*)*node_name)) { 00401 freeNull(*node_name); 00402 return JBXL_XML_PARSE_ERROR; 00403 } 00404 00405 // Empty TAG 00406 if (*pt=='/') { 00407 if (*(pt+1)!='>') { 00408 freeNull(*node_name); 00409 return JBXL_XML_PARSE_ERROR; 00410 } 00411 nn += 1; 00412 *node_end = TRUE; 00413 //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name)); 00414 } 00415 00416 // Attribute 00417 else if (*pt==' ') { 00418 pp = pt = pt + 1; 00419 while (*pt==' ' || *pt==CHAR_TAB || *pt==CHAR_LF || *pt==CHAR_CR) pt++; 00420 nn += (int)(pt - pp) + 1; 00421 00422 pp = pt; 00423 pt = skip_chars(pt, "/>"); 00424 if (pt==NULL) { 00425 freeNull(*node_name); 00426 return JBXL_XML_PARSE_ERROR; 00427 } 00428 00429 mm = (int)(pt - pp); 00430 if (mm>0) { 00431 *node_attr = (char*)malloc((size_t)(mm + 1)); 00432 if (*node_attr==NULL) { 00433 freeNull(*node_name); 00434 return JBXL_MALLOC_ERROR; 00435 } 00436 memcpy(*node_attr, pp, mm); 00437 (*node_attr)[mm] = '\0'; 00438 nn += mm; 00439 //PRINT_MESG("ATTR --> %s %d\n", *node_attr, (int)strlen(*node_attr)); 00440 } 00441 00442 if (*pt=='/') { 00443 if (*(pt+1)!='>') { 00444 freeNull(*node_name); 00445 freeNull(*node_attr); 00446 return JBXL_XML_PARSE_ERROR; 00447 } 00448 nn += 1; 00449 *node_end = TRUE; 00450 //PRINT_MESG("END --> %s %d\n", *node_name, (int)strlen(*node_name)); 00451 } 00452 } 00453 00454 //else {} *pt=='>' 00455 00456 return nn + 1; 00457 }
tXML* xml_rpc_add_array(tXML* xml, tXML* array)
xml | データを繋げるためのポインタ. | |
array | <value> データ |
<value><struct> データから 配列データ <data>...</data> を作って繋げていく.
Definition at line 3429 of file txml.c.
References add_xml_node(), and join_xml.
03430 { 03431 if (xml==NULL) xml = add_xml_node(NULL, "data"); 03432 join_xml(xml, array); 03433 03434 return xml; 03435 }
tXML* xml_rpc_add_member(tXML* xml, char* name, char* value, char* kind)
XML-RPC の <member> データを作って,繋げていく.先頭には <struct> ノードが付く.
xml | データを繋げるためのポインタ. | |
name | <name> ノードの値 | |
value | <value><...> ノードの値 | |
kind | value のデータの種類.NULL または "" の場合は "string" になる. |
<struct><member><name>name</name><value><kind>value</kind></value></member><member>....</member>
Definition at line 3368 of file txml.c.
References add_xml_content(), and add_xml_node().
03369 { 03370 if (name==NULL) return xml; 03371 03372 if (xml==NULL) xml = add_xml_node(NULL, "struct"); 03373 03374 tXML* mem = add_xml_node(xml, "member"); 03375 tXML* mnm = add_xml_node(mem, "name"); 03376 tXML* val = add_xml_node(mem, "value"); 03377 tXML* knd; 03378 if (kind==NULL) knd = add_xml_node(val, "string"); 03379 else if (kind[0]=='\0') knd = add_xml_node(val, "string"); 03380 else knd = add_xml_node(val, kind); 03381 03382 add_xml_content(mnm, name); 03383 add_xml_content(knd, value); 03384 03385 return xml; 03386 }
tXML* xml_rpc_end_array(tXML* xml)
配列データを閉じて,送信用データを生成する.
xml | <data> ノードのポンタ |
<value><array><data>...</data><data>...</data>....</array></value>
Definition at line 3451 of file txml.c.
References add_xml_node(), and join_xml.
03452 { 03453 tXML* ptr = add_xml_node(NULL, "value"); 03454 tXML* val = add_xml_node(ptr, "array"); 03455 join_xml(val, xml); 03456 03457 return ptr; 03458 }
tXML* xml_rpc_end_member(tXML* xml)
<struct><member> データを閉じて,<value> データを作り出す.
配列データにしない場合は,このデータを xml_rpc_request_pack() に渡して,送信用データを生成することも可能.
xml | <struct> データ |
<value><strcut><member>...</member><member>...</member>...</struct></value>
tXML* xml = NULL; xml = xml_rpc_add_member(xml, "session", info->session, ""); xml = xml_rpc_add_member(xml, "message", info->message, ""); ...... xml = xml_rpc_end_member(xml); Buffer buf = xml_rpc_request_pack(Moodle_Service, xml);
Definition at line 3411 of file txml.c.
References add_xml_node(), and join_xml.
03412 { 03413 tXML* ptr = add_xml_node(NULL, "value"); 03414 join_xml(ptr, xml); 03415 03416 return ptr; 03417 }
XML-RPC用のデータを生成する.
name | XML-RPC のメソッド名 | |
xml | 送信用データが格納された XMLデータ. |
tXML* xml = NULL; tXML* array = NULL; xml = xml_rpc_add_member(NULL, "host", "server", "string"); xml = xml_rpc_add_member(xml, "id", "xyb12265092", "string"); xml = xml_rpc_end_member(xml); array = xml_rpc_add_array(NULL, xml); xml = xml_rpc_add_member(NULL, "host", "client", "string"); xml = xml_rpc_add_member(xml, "id", "abc162aa890", "string"); xml = xml_rpc_end_member(xml); array = xml_rpc_add_array(array, xml); xml = xml_rpc_add_member(NULL, "host", "localhost", "string"); xml = xml_rpc_add_member(xml, "id", "shbR1222201", "string"); xml = xml_rpc_end_member(xml); array = xml_rpc_add_array(array, xml); array = xml_rpc_end_array(array); Buffer buf = xml_rpc_request_pack("mod_mdlds_write_nbdata", array);
Definition at line 3336 of file txml.c.
References add_xml_content(), add_xml_node(), init_xml_doc(), join_xml, xml_inverse_parse(), and XML_ONELINE_FORMAT.
03337 { 03338 tXML* ptr = init_xml_doc(); 03339 tXML* top = add_xml_node(ptr, "methodCall"); 03340 tXML* mnm = add_xml_node(top, "methodName"); 03341 tXML* prs = add_xml_node(top, "params"); 03342 tXML* prm = add_xml_node(prs, "param"); 03343 add_xml_content(mnm, name); 03344 03345 join_xml(prm, xml); 03346 Buffer buf = xml_inverse_parse(ptr, XML_ONELINE_FORMAT); 03347 03348 return buf; 03349 }
void xml_to_Buffer(tXML* pp, Buffer* buf, int mode, int indent)
xml_inverse_parse()用の補助関数. ppに格納された XMLデータを元の書式に戻して Bufferに格納する.
pp | XMLデータの格納されたツリーへのポインタ | |
buf | 変換したXMLデータを格納する Buffer変数.データ格納領域は予め確保しておく. | |
mode | 元のXMLへ戻す時の書式 | |
mode | XML_ONELINE_FORMAT 改行なしの一行にする. | |
mode | XML_CRLF_FORMAT ノードの終わりを CR(0x0d), LF(0x0a)で改行する. | |
mode | XML_INDENT_FORMAT 先頭にインデント(TAB)をつけ,ノードごとに改行する. | |
indent | インデントを付け始める深さ.modeが XML_INDENT_MODE のときのみ有効. |
Definition at line 936 of file txml.c.
References xml_close_node_Buffer(), xml_open_node_Buffer(), and xml_to_Buffer().
Referenced by xml_inverse_parse(), and xml_to_Buffer().
00937 { 00938 do { 00939 xml_open_node_Buffer(pp, buf, mode, indent); 00940 if (pp->next!=NULL) { 00941 xml_to_Buffer(pp->next, buf, mode, indent); 00942 xml_close_node_Buffer(pp, buf, mode, indent); 00943 } 00944 00945 pp = pp->ysis; 00946 } while(pp!=NULL); 00947 00948 return; 00949 }