在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;
 }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值