Добавление коллекции схем в экземпляр SAXXMLReader60 с использованием MSXML 6.0 - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь написать утилиту проверки xsd с использованием 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 ++.Единственная ошибка, которая остается, это.Любая помощь приветствуется.

Редактировать:

После перехода по этой приятной ссылке:

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"));

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

1 Ответ

0 голосов
/ 06 декабря 2011

ОК после поиска, я нашел решение своей проблемы:

            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()));

Надеюсь, кому-то еще это пригодится.

Редактировать:

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

    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();

...