使用MSXML 6.0将架构集合添加到SAXXMLReader60实例

时间:2011-12-06 13:01:00

标签: c++ xml validation xsd msxml

我尝试使用MSXML 6.0编写xsd验证程序实用程序。一切都很好,除了这一行:

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

这会引发此错误:error C2664: 'ISAXXMLReader::putProperty' : cannot convert parameter 2 from 'MSXML2::IXMLDOMSchemaCollectionPtr' to 'VARIANT'

这是可以理解的但是如何向读者添加模式实例?

仅供参考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 :(得分:0)

搜索完成后我找到了解决问题的方法:

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