xmlプライマリデータ構造



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];
}