-- 作者:wFirebird
-- 发布时间:2/8/2006 12:30:00 PM
-- 在VC下编程自动加载Schema文件来解析XML的例子[原创]
这个困惑我两个星期的问题终于让一个网上朋友帮我解决了~ 下面是原代码,希望在这里有困惑的人都能走出坑去 :) 如果有人还想交流一下的话,我很喜欢 :) 我的QQ:88342036 MSN:firebird_668899@hotmail.com 原代码:(注:请修改load下面的路径以及 pSchemaCache->add("http://www.tuha.net", pXSDDoc.GetInterfacePtr())中的http://www.tuha.net"为targetNamespace的地址 我以前就失败在这里,要特别小心) // AddXMLSchema.cpp : Defines the entry point for the console application. // #include "stdafx.h" #import <msxml4.dll> using namespace MSXML2; int checkParseError(IXMLDOMParseErrorPtr pError); void dump_com_error(_com_error &e); int main(int argc, char* argv[]) { CoInitialize(NULL); try{ IXMLDOMParseErrorPtr pError; // load the XML file // ****** you need to use IXMLDOMDocument2 interface ********* IXMLDOMDocument2Ptr pXMLDoc; HRESULT hr = pXMLDoc.CreateInstance(__uuidof(DOMDocument40)); pXMLDoc->async = VARIANT_FALSE; hr = pXMLDoc->load("e:\\books.xml"); //check on the parser error if(hr!=VARIANT_TRUE) { return checkParseError(pXMLDoc->parseError); } //load the XSD file IXMLDOMDocumentPtr pXSDDoc; hr = pXSDDoc.CreateInstance(__uuidof(DOMDocument40)); pXSDDoc->async = VARIANT_FALSE; hr = pXSDDoc->load("e:\\books.xsd"); //check on the parser error if(hr!=VARIANT_TRUE) { return checkParseError(pXSDDoc->parseError); } //create schemacache IXMLDOMSchemaCollectionPtr pSchemaCache; hr = pSchemaCache.CreateInstance(__uuidof(XMLSchemaCache40)); pXMLDoc->schemas = pSchemaCache.GetInterfacePtr(); //hook it up with XML Document hr = pSchemaCache->add("http://www.tuha.net", pXSDDoc.GetInterfacePtr()); //call validate pError = pXMLDoc->validate(); if(pError->errorCode != S_OK) { _bstr_t parseError = _bstr_t("Error code: ")+ _bstr_t(pError->errorCode) +_bstr_t("\n") + _bstr_t("Reason: ")+ pError->Getreason(); MessageBox(NULL, (char*)parseError, "Parse Error",MB_OK); return -1; } else MessageBox(NULL,"Valiation succeeded", "Results",MB_OK); } catch(_com_error &e) { dump_com_error(e); } return 0; } int checkParseError(IXMLDOMParseErrorPtr pError) { _bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline()) + _bstr_t("\n")+ _bstr_t(pError->Getreason()); MessageBox(NULL,parseError, "Parse Error",MB_OK); return -1; } void dump_com_error(_com_error &e) { printf("Error\n"); printf("\a\tCode = %08lx\n", e.Error()); printf("\a\tCode meaning = %s", e.ErrorMessage()); _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); printf("\a\tSource = %s\n", (LPCSTR) bstrSource); printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription); } XML文件我也给出来吧全点的会让大家清楚些。 books.xml文件 <?xml version="1.0" encoding="UTF-8"?> <n:Collection xmlns:n="http://www.tuha.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.tuha.net E:\books.xsd"> <Book> <Title>String</Title> <Author>String</Author> <Publisher>String</Publisher> </Book> </n:Collection> books.xsd文件 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.tuha.net"> <xs:element name="Collection"> <xs:complexType> <xs:sequence> <xs:element name="Book"> <xs:complexType> <xs:sequence> <xs:element name="Title" type="xs:string" maxOccurs="1"/> <xs:element name="Author" type="xs:string" minOccurs="1"/> <xs:element name="Publisher" type="xs:string" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> 我测试无数次都有效,如果不想更改设置就直接把上面的文件放E盘 希望对大家有用!
|