2011-12-06 1 views
0

Я пытаюсь написать утилиту xsd validator с помощью MSXML 6.0. Все это хорошо и приятно, кроме этой одной линии:Добавление коллекции схем в экземпляр SAXXMLReader60 с использованием MSXML 6.0

this->myReader->putProperty(L"schemas", pXS); 

Это бросает эту ошибку: error C2664: 'ISAXXMLReader::putProperty' : cannot convert parameter 2 from 'MSXML2::IXMLDOMSchemaCollectionPtr' to 'VARIANT'

что вполне понятно, но как можно добавить экземпляр схемы для читателя?

FYI myReader это:

ISAXXMLReader * myReader; 

и инициализируется следующим образом:

HRESULT hr = CoCreateInstance(__uuidof(SAXXMLReader60), 
           NULL, 
           CLSCTX_ALL, 
           __uuidof(ISAXXMLReader), 
           (void **)&this->myReader); 

И PXS является:

MSXML2::IXMLDOMSchemaCollectionPtr pXS; 

pXS.CreateInstance(__uuidof(MSXML2::XMLSchemaCache60), NULL, CLSCTX_INPROC_SERVER); 

Некоторые из ссылок, которые я прочитал:

http://msdn.microsoft.com/en-us/library/ms762787(v=VS.85).aspx

http://support.microsoft.com/kb/309535

http://msdn.microsoft.com/en-us/library/windows/desktop/cc507429(v=VS.85).aspx

Как обычно документации MSDN очень приятно ..

пример они обеспечивают работу, но мне нужно собрать все ошибки, поэтому я перевел VB пример в одной из ссылок на C++. Единственная ошибка, которая остается таковой. Любая помощь приветствуется.

Edit:

Выполнив эту хорошую ссылку:

раздел

http://msdn.microsoft.com/en-us/library/windows/desktop/ms766451(v=vs.85).aspx

C++:

Пространство имен, чтобы связать с указанной схемой. Пустая строка, "", свяжет схему с пустым пространством имен, xmlns = "".

И делает это:

nResult = pIXMLDOMSchemaCollection2Ptr->add(_T(""), _T("c:\\temp\\collection.xsd")); 

Хорошая авария происходит. Кто-нибудь знает, как на земле добавить схему без пространства имен в этой вещи?

ответ

0

OK после поиска через Я нашел решение моей проблемы:

  MSXML2::IXMLDOMSchemaCollectionPtr pSchemaCache; 
      pSchemaCache.CreateInstance(__uuidof(XMLSchemaCache60)); 

      if(FAILED(pSchemaCache.CreateInstance(__uuidof(XMLSchemaCache60)))) 
      { 
       throw AX::Base::Exception(__FILE__, __FUNCTION__, __LINE__, AX::Base::Exception::ABORT_EXECUTION, "Could not create Schema cache instance!"); 
      } 

      if(FAILED(pSchemaCache->add(L"urn:books", myXSDFile.c_str()))) 
      { 
       throw AX::Base::Exception(__FILE__, __FUNCTION__, __LINE__, AX::Base::Exception::INVALID_PARAM_ERROR, "Could not add schema %s to Schema cache instance!", this->myXSDFile.c_str()); 
      } 
      this->myReader->putProperty(L"schemas", _variant_t(pSchemaCache.GetInterfacePtr())); 

Надеюсь, кто-то пойдет на пользу от этого.

Edit:

Как добавить пустое пространство имен:

bool const XmlValidator::validate() 
    { 
     //clear any previous validation errors 
     this->myErrorHandler->clearErrorsAndWarnings(); 
     //do validation 
     const std::wstring ns = this->converStringToWString(this->myXMLNamespace); 
     try 
     { 
      // Check for existing schema associated with this namespace URI. 
      ISchema* pExistingSchema = NULL; 
      _bstr_t bstrNamespace = ns.c_str(); 
      HRESULT hr = this->mySchemaCache->getSchema(bstrNamespace, &pExistingSchema); 
      if (SUCCEEDED(hr)) 
      { 
       // Remove the existing schema. 
       hr = this->mySchemaCache->remove(bstrNamespace); 
       if (FAILED(hr)) 
        return false; 
      } 
      // Add the new schema. 
      hr = this->mySchemaCache->add(bstrNamespace, _variant_t(this->converStringToWString(this->myXSDFile).c_str())); 
      if (FAILED(hr)) 
       return false; 
     } 
     catch(...) 
     { 
      throw AX::Base::Exception(__FILE__, __FUNCTION__, __LINE__, AX::Base::Exception::INVALID_PARAM_ERROR, "Xml namespace %s is different from Xsd namespace!", this->myXMLNamespace.c_str()); 
     } 

     this->myReader->parseURL(this->converStringToWString(this->myXMLFile).c_str()); 
     //return true if there were no validation errors at all 
     return this->myErrorHandler->getMyErrorsAndWarnings().size() == 0; 
    } 

Обратите внимание на эту строку:_bstr_t bstrNamespace = ns.c_str();