如何用libxml库实现schema语法校验的代码
时间: 2024-05-08 22:17:53 浏览: 248
以下是用libxml库实现schema语法校验的代码示例:
```c
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlschemas.h>
int main(int argc, char **argv) {
xmlDocPtr doc;
xmlSchemaPtr schema = NULL;
xmlSchemaParserCtxtPtr ctxt;
xmlSchemaValidCtxtPtr vctxt;
int ret = 0;
// 加载XML文档
doc = xmlReadFile(argv[1], NULL, 0);
if (doc == NULL) {
fprintf(stderr, "Failed to parse %s\n", argv[1]);
return -1;
}
// 创建schema解析上下文
ctxt = xmlSchemaNewParserCtxt(argv[2]);
if (ctxt == NULL) {
fprintf(stderr, "Failed to create schema parser context\n");
ret = -1;
goto cleanup;
}
// 解析schema文档
schema = xmlSchemaParse(ctxt);
if (schema == NULL) {
fprintf(stderr, "Failed to parse schema document\n");
ret = -1;
goto cleanup;
}
// 创建schema校验上下文
vctxt = xmlSchemaNewValidCtxt(schema);
if (vctxt == NULL) {
fprintf(stderr, "Failed to create schema validation context\n");
ret = -1;
goto cleanup;
}
// 校验XML文档
ret = xmlSchemaValidateDoc(vctxt, doc);
if (ret != 0) {
fprintf(stderr, "XML document is not valid\n");
} else {
fprintf(stderr, "XML document is valid\n");
}
cleanup:
if (vctxt != NULL) {
xmlSchemaFreeValidCtxt(vctxt);
}
if (schema != NULL) {
xmlSchemaFree(schema);
}
if (ctxt != NULL) {
xmlSchemaFreeParserCtxt(ctxt);
}
if (doc != NULL) {
xmlFreeDoc(doc);
}
return ret;
}
```
该代码首先加载XML文档,然后创建schema解析上下文,解析schema文档,创建schema校验上下文,最后校验XML文档。如果XML文档不符合schema规定的语法,则输出“XML document is not valid”,否则输出“XML document is valid”。在校验完成后,需要释放所有创建的上下文和文档对象,以避免内存泄漏。
阅读全文