我尝试使用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"));
发生了很好的崩溃。有没有人知道如何添加没有命名空间的模式呢?
答案 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();