VBA中使用MSXML 6.0实现多命名空间XML Schema验证问题
在MSXML 6.0中为XMLSchemaCache添加多个命名空间
很简单,要给XMLSchemaCache60绑定多个命名空间,只需要对每个命名空间单独调用一次Add方法就可以了。Add方法每次负责绑定一个命名空间URI和对应的XSD文件(或XSD DOM对象),重复调用就能完成多命名空间的配置。
下面是补全后的完整代码示例,帮你把多命名空间的逻辑整合进去:
Sub XSD_Validation() Dim xmlDoc As MSXML2.DOMDocument60 Dim objSchemaCache As New XMLSchemaCache60 Dim objErr As MSXML2.IXMLDOMParseError ' 绑定第一个命名空间到对应的XSD文件 objSchemaCache.Add "http://your-first-namespace-uri", "path/to/your-first-schema.xsd" ' 绑定第二个命名空间到对应的XSD文件 objSchemaCache.Add "http://your-second-namespace-uri", "path/to/your-second-schema.xsd" ' 初始化XML文档并关联Schema缓存 Set xmlDoc = New MSXML2.DOMDocument60 xmlDoc.async = False ' 必须同步加载,保证验证完成后再执行后续逻辑 xmlDoc.validateOnParse = True ' 开启解析时自动验证 Set xmlDoc.schemas = objSchemaCache ' 将Schema缓存关联到XML文档 ' 加载需要验证的XML文件 xmlDoc.Load "path/to/your-target.xml" ' 检查验证结果 Set objErr = xmlDoc.parseError If objErr.errorCode <> 0 Then MsgBox "验证失败:" & vbCrLf & _ "错误代码:" & objErr.errorCode & vbCrLf & _ "错误信息:" & objErr.reason & vbCrLf & _ "错误位置:第" & objErr.line & "行,第" & objErr.linepos & "列" Else MsgBox "XML与XSD完全匹配,验证通过!" End If ' 清理对象 Set objErr = Nothing Set xmlDoc = Nothing Set objSchemaCache = Nothing End Sub
几个关键提醒:
- 命名空间URI必须和XML文件中声明的完全一致(URI是大小写敏感的,斜杠、后缀都不能错)
- 如果你的XSD不是本地文件,而是已经加载为
DOMDocument60对象,也可以把Add的第二个参数换成该DOM对象 - 千万别忘了设置
xmlDoc.async = False,异步加载会导致验证逻辑提前执行,拿不到正确的验证结果
内容的提问来源于stack exchange,提问作者Tim Felber
相关产品推荐
相关产品推荐

