[经验总结] 在Windows平台基于libxml+libxslt实现Schema模式验证与XSLT模板转换

本文介绍如何使用libxml2和libxslt库进行XML文档的验证与转换。包括使用XMLSchema验证XML文档的步骤及代码示例,以及利用XSLT模板文件转换XML文档的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STEP1 : 在这个网址: http://xmlsoft.org/sources/win32/

下载这几个包:

iconv-1.9.2.win32.zip

libxml2-2.7.3.win32.zip

libxslt-1.1.24.win32.zip

将lib,dll,include文件分别拷贝到合适的位置。

STEP2:

编写测试代码:

XML Schema:

#include "libxml/tree.h" #include "libxml/parser.h" #include "libxml/xmlschemas.h" /**************************************************** @describle 应用XML Schema模板文件验证案例文档 @param schema_filename 模式文件 @param xmldoc XML格式的案例文档 @retval >=0 验证成功 < 0 验证失败 ****************************************************/ int is_valid(const char *schema_filename, const char *xmldoc) { xmlDocPtr doc; doc = xmlReadFile(xmldoc, NULL, XML_PARSE_NONET|XML_PARSE_NOENT); if ( NULL == doc) { MessageBox(NULL,"读取XML文档错误",NULL,NULL); return -1; } xmlDocPtr schema_doc = xmlReadFile(schema_filename, NULL, XML_PARSE_NONET|XML_PARSE_NOENT); if ( NULL == schema_doc) { MessageBox(NULL,"读取Schema错误",NULL,NULL); return -1; } xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(schema_doc); if (NULL == parser_ctxt) { return -1; } xmlSchemaPtr schema = xmlSchemaParse(parser_ctxt); if (schema == NULL) { return -1; } xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema); if (NULL == valid_ctxt) { return -1; } int is_valid = (xmlSchemaValidateDoc(valid_ctxt,doc) == 0); xmlSchemaFreeValidCtxt(valid_ctxt); xmlSchemaFree(schema); xmlSchemaFreeParserCtxt(parser_ctxt); xmlFreeDoc(schema_doc); return is_valid; }

XSLT:

#include "libxslt/xslt.h" #include "libxslt/xsltInternals.h" #include "libxslt/transform.h" #include "libxslt/xsltutils.h" /**************************************************** @describle 应用XSLT模板转换案例格式 @param stylesheet XSLT模板文件 @param olddoc 待转换案例文件 @param newdoc 转换后的案例文件 @retval >=0 转换成功 < 0 转换失败 ****************************************************/ int xslt(const char *stylesheet, const char *olddoc, const char *newdoc) { const char *params[16+1]; int ret; xsltStylesheetPtr cur = NULL; xmlDocPtr doc, res; FILE *outfp; /*设置参数*/ params[0] = NULL; /*设置libxml*/ xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = 1; cur = xsltParseStylesheetFile((const xmlChar *)stylesheet); if ( NULL == cur ) { MessageBox(NULL,"分析XSLT模板文件出错",NULL,NULL); return -1; } doc = xmlParseFile(olddoc); res = xsltApplyStylesheet(cur, doc, (const char **)params); if ( NULL == res ) { MessageBox(NULL,"应用模板出错",NULL,NULL); return -1; } if (NULL == res->children) { MessageBox(NULL,"res->children为NULL",NULL,NULL); return -1; } ret = xsltSaveResultToFilename(newdoc,res,cur,0); xsltFreeStylesheet(cur); xmlFreeDoc(res); xmlFreeDoc(doc); xsltCleanupGlobals(); xmlCleanupParser(); return ret; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值