2009-08-18 20 views
1

ユーザーが提供するXPathクエリを検証して、構文的に正しいことを確認します。XPath式の検証

XML文書を使用せずにXPathクエリを「検証する」ことは意味がありますか?

どのように私はlibxmlでこのようなことを達成できますか?

答えて

4

XPath式を評価せずにlibxmlを使用してコンパイルできます。 xmlXPathCompileを参照してください。無効な式の場合、戻り値はNULLにする必要があります。

#include <stdio.h> 
#include <libxml/xpath.h> 
#include <libxml/xmlerror.h> 

void 
handle_structured_error(void *userdata, xmlErrorPtr err) 
{ 
    printf("%s", err->message); 
} 


int 
main(int argc, char **argv) 
{ 
    if (argc < 2) 
    return 1; 
    const char *expr = argv[1]; 
    xmlXPathContextPtr ctx = xmlXPathNewContext(NULL); 

    xmlSetStructuredErrorFunc(ctx, &handle_structured_error); 
    xmlXPathCompExprPtr p = xmlXPathCtxtCompile(ctx, (xmlChar *)expr); 


    if (p) { 
    printf("Valid: %s\n", expr); 
    xmlXPathFreeCompExpr(p); 
    } else { 
    printf("Invalid: %s\n", expr); 
    } 
    xmlXPathFreeContext(ctx); 
    return 0; 
} 
+0

NULLが返されたときに問題を解決する方法を示すメッセージを表示するにはどうすればよいですか? xmlXPathEvalExpressionを使用すると、構文が正しくないことを示すエラーメッセージが表示されます。 – user128026

+0

私はxmlXPathEvalExpressionを使用できません。プログラムのこの段階でxmlXPathContextを持っていないためです。 – user128026

+0

私の答えを見てください:xmlXPathEvalExpressionではなくxmlXPathCompileを使用してください。 xmlXPathContextはまったく必要ありません。 – p00ya