xmlプライマリデータ構造
5196 ワード
xmlプライマリデータ構造
以下にlibxmlの主なデータ型を紹介します.アプリケーションプログラミングにとって、これらのデータ型は理解し、把握する必要があります.
1.内部文字タイプxmlChar
xmlCharはlibxml 2の文字タイプで、ライブラリ内のすべての文字、文字列はこのデータ型に基づいています.その定義はxmlstringです.hにおいて、定義の説明は以下の通りである.
typedef unsigned char xmlChar;
unsigned charを内部文字フォーマットとして使用するのは、UTF-8符号化によく適応できることを考慮しているが、UTF-8符号化はlibxml 2の内部符号化であり、他のフォーマットの符号化はこの符号化に変換されてlibxml 2で使用される.
xmlChar*は、libxml 2で文字列ポインタタイプとしてよく使用されます.多くの関数は、メモリを動的に割り当てるxmlChar*変数を返します.このような関数を使用する場合は、メモリを手動で削除する必要があります.
2.xmlChar相関関数
xmlCharには、標準Cのcharタイプと同様に、動的メモリ割り当て、文字列操作などの関連関数もあります.例えば、xmlMallocはメモリを動的に割り当てる関数、xmlFreeはセットの解放メモリ関数、xmlStrcmpは文字列比較関数などである.基本的にxmlChar文字列に関する関数はxmlstringである.hで定義され、動的メモリ割り当て関数はxmlmemory.hヘッダファイルで定義します.
3.xmlChar*と他のタイプとの変換
実際のプログラミングでは、xmlChar*とchar*の間で強制的なタイプ変換が常に必要であるため、マクロBAD_が定義されています.CASTは、以下のように定義されています.
#define BAD_CAST (xmlChar *)
4.XMLでよく使われる再定義
XMLプログラムではxmlChildrenNodeという名前がよく見られますが、実はtreeに定義されています.hでの再定義.再定義は次のとおりです.
#define xmlChildrenNode children
5.文書型xmlDoc、ポインタxmlDocPtr
xmlDocはstructで、ファイル名、ドキュメントタイプ、サブノードなど、xmlDocPtrがxmlDoc*に等しいxmlに関する情報を保存します.ドキュメントポインタに関連する関数は以下のとおりです.
xmlNewDoc関数は、新しいドキュメントポインタを作成します.
xmlParseFile関数は、UTF-8形式のドキュメントをデフォルトで読み込み、ドキュメントポインタを返します.
xmlReadFile関数は、ある符号化されたxmlドキュメントを読み込み、ドキュメントポインタを返します.
xmlFreeDocはドキュメントポインタを解放します.
特に、xmlFreeDocが呼び出されると、ドキュメントに含まれるすべてのノードメモリが解放されるので、一般に、ノードがドキュメントから除去されない限り、xmlFreeNodeまたはxmlFreeNodeListを手動で呼び出す必要はありません.一般的に、1つのドキュメント内のすべてのノードを動的に割り当て、ドキュメントに追加し、最後にxmlFreeDocを呼び出してすべてのノード申請の動的メモリを一度に解放する必要があります.これも、xmlNodeFreeがプログラムであまり見られない理由です.
xmlSaveFileは、ドキュメントをデフォルトでファイルに保存します.
xmlSaveFormatFileEncは、文書を何らかの符号化形式でファイルに格納することができる.
6.ノードタイプxmlNode、ポインタxmlNodePtr
ノードはXMLの中で最も重要な要素であり、xmlNodeはXMLドキュメントの中のノードを代表し、structとして実現され、この構造の内容は豊富で重要であり、treeに定義されている.hでは、以下のように具体的に説明する.
typedef struct _xmlNode xmlNode;
typedef xmlNode *xmlNodePtr;
struct _xmlNode {
void *_private; /* application data */
xmlElementType type; /* type number, must be second ! */
const xmlChar *name; /* the name of the node, or the entity */
struct _xmlNode *children; /* parent->childs link */
struct _xmlNode *last; /* last child link */
struct _xmlNode *parent; /* child->parent link */
struct _xmlNode *next; /* next sibling link */
struct _xmlNode *prev; /* previous sibling link */
struct _xmlDoc *doc; /* the containing document */
/* End of common part */
xmlNs *ns; /* pointer to the associated namespace */
xmlChar *content; /* the content */
struct _xmlAttr *properties;/* properties list */
xmlNs *nsDef; /* namespace definitions on this node */
void *psvi; /* for type/PSVI informations */
unsigned short line; /* line number */
unsigned short extra; /* extra data for XPath/XSLT */
};
ノード間はチェーンテーブルとツリーの2つの方法で同時に組織されており、nextとprevポインタはチェーンテーブルを構成することができ、parentとchildrenはツリーに組織することができる.また、この構造には次の重要なメンバーがあります.
content:ノード内のテキストの内容.
doc:ノードが属するドキュメント.
name:ノード名.
ns:ノードの名前空間.
properties:ノードプロパティのリスト.
XMLドキュメントの操作の根本原理は,ノード間でノードの各情報を移動,照会し,追加,削除,修正などの操作を行うことである.
xmlDocSetRootElement関数は、1つのノードをドキュメントのルートノードに設定できます.これは、ドキュメントとノードを接続する重要な手段であり、ルートノードがあれば、すべてのサブノードがルートノードに順次接続され、XMLツリーに組織されます.
7.XML属性
XML属性もプログラミングでよく使われる構造で、以下のように定義されています.
struct _xmlAttr {
void * _private; /* application data */
xmlElementType type; /* XML_ATTRIBUTE_NODE, must be second ! */
const xmlChar * name ; /*the name of the property */
struct _xmlNode * children; /*the value of the property */
struct _xmlNode * last; /*NULL */
struct _xmlNode * parent; /*child->parent link */
struct _xmlAttr * next; /*next sibling link */
struct _xmlAttr * prev; /*previous sibling link */
struct _xmlDoc * doc; /*the containing document */
xmlNs * ns; /*pointer to the associated namespace */
xmlAttributeType atype; /*the attribute type if validating */
void * psvi; /*for type/PSVI informations */
}
8.ノードセットタイプxmlNodeSet、ポインタタイプxmlNodeSetPtr
ノード集合はノードからなる変数を表し、ノード集合はXPathのクエリ結果としてのみ現れるためxpathに定義される.hでは、以下のように定義される.
/* A node-set (an unordered collection of nodes without duplicates). */
typedef struct _xmlNodeSet xmlNodeSet;
typedef xmlNodeSet *xmlNodeSetPtr;
struct _xmlNodeSet {
int nodeNr; /* number of nodes in the set */
int nodeMax; /* size of the array as allocated */
xmlNodePtr *nodeTab; /* array of nodes in no particular order */
/* @@ with_ns to check wether namespace nodes should be looked at @@ */
};
ノードセットには、ノードセットのノード数、最大収容可能なノード数、およびノード配列ヘッダポインタの3つのメンバーがあることがわかります.ノードセット内の各ノードへのアクセス方法は、次のとおりです.
xmlNodeSetPtr nodeset = XPath
for (int i = 0; i < nodeset->nodeNr; i++)
{
nodeset->nodeTab[i];
}