libxml2の使い方メモ
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は参考になる。