Проверить выражение XPath

Я хотел бы проверить предоставленный пользователем запрос XPath, чтобы убедиться, что он синтаксически правильный.

Имеет ли смысл «проверять» запрос XPath без XML-документа?

Как я могу добиться этого в libxml?


person user128026    schedule 18.08.2009    source источник


Ответы (1)


Вы можете скомпилировать выражение 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;
}
person p00ya    schedule 18.08.2009
comment
Как я могу показать пользователю сообщение, описывающее, как решить проблему, когда возвращается NULL? При использовании xmlXPathEvalExpression выводится сообщение об ошибке, в котором показано, где неверен синтаксис. - person user128026; 19.08.2009
comment
имейте в виду, что я не могу использовать xmlXPathEvalExpression, потому что у меня нет xmlXPathContext на этом этапе в программе - person user128026; 19.08.2009
comment
см. мой ответ: используйте xmlXPathCompile, а не xmlXPathEvalExpression. Вам вообще не нужен xmlXPathContext. - person p00ya; 19.08.2009