以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DOM/SAX/XPath 』  (http://bbs.xml.org.cn/list.asp?boardid=11)
----  在VC下编程自动加载Schema文件来解析XML的例子[原创]  (http://bbs.xml.org.cn/dispbbs.asp?boardid=11&rootid=&id=27071)


--  作者: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盘
希望对大家有用!


--  作者:zz277
--  发布时间:4/16/2006 11:02:00 AM

--  
好人
--  作者:lyshsd
--  发布时间:4/27/2006 3:14:00 PM

--  
请教c++处理xml,是不是不支持last()函数?
sPath="/resource/script/sn/s[last()]"
pNode=m_pDOMDoc->selectSingleNode(sPath)运行出错,但把s[last()]换成s[1]就没有问题。
多谢先!

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms