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

相关官方文档:

http://xmlsoft.org/XSLT/tutorial/libxslttutorial.html

  

下文引用自:

http://blog.csdn.net/ThinkHY/archive/2009/02/26/3940322.aspx

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;

 }

转载于:https://www.cnblogs.com/wfpb/archive/2011/03/23/1993137.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值