libxml2をC言語で使うときのメモ。

・parseの仕方はexamplesを参照(たくさん例がある)

・逆にツリーをたどったりするサンプルはほとんどないので、google code searchを頼る。

・「ある名前を持った子要素を一つ取り出す」という関数はないため、

xmlNode *get_child (xmlNode *node, const char *tag)
{
xmlNode *child;

for (child = node->children; child != NULL; child = child->next)
if (!strcmp ((char *)child->name, tag))
return child;
return NULL;
}


のようなユーティリティ関数を多くのプロジェクトで書いている。

・XPathで相対ロケーションパスを使う場合、コンテキストのノードにカレントノードを指定する

xpathCtx = xmlXPathNewContext(doc);
xpathCtx->node = currentNode;
xpathObj = xmlXPathEvalExpression(...xpath..., xpathCtx);



・RelaxNGによるバリデーションについても情報は少ない。


// RelaxNGパーサーコンテキストの生成
xmlRelaxNGParserCtxtPtr ctxt = xmlRelaxNGNewMemParserCtxt(rng_string, strlen(rng_string));
// ファイルからなら、docを作ってxmlRelaxNGNewDocParserCtxtを使う。

// RelaxNGパーサーの生成
xmlRelaxNGPtr relaxngschemas = xmlRelaxNGParse(ctxt);
if(relaxngschemas == NULL) {
// エラー処理
}
xmlRelaxNGFreeParserCtxt(ctxt);

// 実際のバリデーション
xmlRelaxNGValidCtxtPtr vctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
int ret = xmlRelaxNGValidateDoc(vctxt, doc);
if (ret != 0) {
// エラー処理
}
xmlRelaxNGFreeValidCtxt(vctxt);



・RelaxNGのexceptは未実装。

・libxml2に付属のxmllint.cは参考になる。