[經驗總結] 在Windows平台基於libxml+libxslt實現Schema模式驗證與XSLT模板轉換

來源:互聯網
上載者:User

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:

   <br />#include "libxml/tree.h"<br />#include "libxml/parser.h"<br />#include "libxml/xmlschemas.h"</p><p>/****************************************************<br /> @describle 應用XML Schema模板檔案驗證案例文檔<br /> @paramschema_filename 模式檔案<br /> @paramxmldoc XML格式的案例文檔<br /> @retval >=0 驗證成功<br /> < 0 驗證失敗<br />****************************************************/<br />int is_valid(const char *schema_filename, const char *xmldoc) {<br />xmlDocPtr doc;<br />doc = xmlReadFile(xmldoc, NULL, XML_PARSE_NONET|XML_PARSE_NOENT);<br />if ( NULL == doc) {<br />MessageBox(NULL,"讀取XML文檔錯誤",NULL,NULL);<br />return -1;<br />}<br />xmlDocPtr schema_doc = xmlReadFile(schema_filename, NULL, XML_PARSE_NONET|XML_PARSE_NOENT);<br />if ( NULL == schema_doc) {<br />MessageBox(NULL,"讀取Schema錯誤",NULL,NULL);<br />return -1;<br />}<br />xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(schema_doc);<br />if (NULL == parser_ctxt) {<br />return -1;<br />}<br />xmlSchemaPtr schema = xmlSchemaParse(parser_ctxt);<br />if (schema == NULL) {<br />return -1;<br />}<br />xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);<br />if (NULL == valid_ctxt) {<br />return -1;<br />}<br />int is_valid = (xmlSchemaValidateDoc(valid_ctxt,doc) == 0);</p><p>xmlSchemaFreeValidCtxt(valid_ctxt);<br />xmlSchemaFree(schema);<br />xmlSchemaFreeParserCtxt(parser_ctxt);<br />xmlFreeDoc(schema_doc);</p><p>return is_valid;<br />}

 

   XSLT:

        <br />#include "libxslt/xslt.h"<br />#include "libxslt/xsltInternals.h"<br />#include "libxslt/transform.h"<br />#include "libxslt/xsltutils.h"<br />/****************************************************<br /> @describle 應用XSLT模板轉換案例格式<br /> @paramstylesheet XSLT模板檔案<br /> @paramolddoc 待轉換案例檔案<br /> @paramnewdoc 轉換後的案例檔案<br /> @retval >=0 轉換成功<br /> < 0 轉換失敗<br />****************************************************/<br />int xslt(const char *stylesheet, const char *olddoc, const char *newdoc) {<br />const char *params[16+1];<br />int ret;<br />xsltStylesheetPtr cur = NULL;<br />xmlDocPtr doc, res;<br />FILE *outfp;<br />/*設定參數*/<br />params[0] = NULL;<br />/*設定libxml*/<br />xmlSubstituteEntitiesDefault(1);<br />xmlLoadExtDtdDefaultValue = 1;<br />cur = xsltParseStylesheetFile((const xmlChar *)stylesheet);<br />if ( NULL == cur ) {<br />MessageBox(NULL,"分析XSLT模板檔案出錯",NULL,NULL);<br />return -1;<br />}<br />doc = xmlParseFile(olddoc);<br />res = xsltApplyStylesheet(cur, doc, (const char **)params);<br />if ( NULL == res ) {<br />MessageBox(NULL,"應用模板出錯",NULL,NULL);<br />return -1;<br />}<br />if (NULL == res->children) {<br />MessageBox(NULL,"res->children為NULL",NULL,NULL);<br />return -1;<br />}<br />ret = xsltSaveResultToFilename(newdoc,res,cur,0);<br />xsltFreeStylesheet(cur);<br />xmlFreeDoc(res);<br />xmlFreeDoc(doc);<br />xsltCleanupGlobals();<br />xmlCleanupParser();<br />return ret;<br />}

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.