MSXML VBA:根据 XSD 验证 XML:“提供的 '' 命名空间与架构的 targetNamespace 不同。”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11708492/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
MSXML VBA: Validating XML against XSD: "The '' namespace provided differs from the schema's targetNamespace."
提问by David Grant
I'm trying to validate an .XML file against an .XSD file with MSXML 6.0 DOM but on executing the code I'm getting this error message:
我正在尝试使用 MSXML 6.0 DOM 针对 .XSD 文件验证 .XML 文件,但在执行代码时,我收到此错误消息:
Test.xsd#/schema/targetNamespace[1]
"The '' namespace provided differs from the schema's 'http://somewhere.com/root' targetNamespace."
A heavily simplified versions of the .XML and .XSD files also produce the same error:
.XML 和 .XSD 文件的高度简化版本也会产生相同的错误:
XML FILE
XML文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:noderoot xmlns:ns2="http://somewhere.com/root">
<general>
<year>2011</year>
<month>02</month>
</general>
</ns2:noderoot>
XSD FILE
XSD 文件
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://somewhere.com/root"
targetNamespace="http://somewhere.com/root"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
elementFormDefault="unqualified"
attributeFormDefault="unqualified">
<xs:complexType name="TYPE_nodeGeneral">
<xs:sequence>
<xs:element name="year">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="4"/>
<xs:pattern value="\d{4}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="month">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="2"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="TYPE_noderoot">
<xs:sequence>
<xs:element name="general" type="TYPE_nodeGeneral"></xs:element>
</xs:sequence>
</xs:complexType>
<xs:element name="noderoot" type="TYPE_noderoot"></xs:element>
</xs:schema>
In order to validate the XML file I'm using this code written in VBA (Excel 2010):
为了验证 XML 文件,我使用了用 VBA (Excel 2010) 编写的代码:
Sub XSD_Validation()
XML_FILE = "I:\Test.xml"
XSD_FILE = "I:\Test.xsd"
Dim xmlDoc As MSXML2.DOMDocument60
Set xmlDoc = New MSXML2.DOMDocument60
xmlDoc.async = False
xmlDoc.validateOnParse = False
xmlDoc.resolveExternals = False
xmlDoc.Load XML_FILE
' Open XSD file
Dim obXSD As MSXML2.DOMDocument60
Set objXSD = New MSXML2.DOMDocument60
objXSD.async = False
objXSD.Load XSD_FILE
' Populate schema cache
Dim objSchemaCache As XMLSchemaCache60
Set objSchemaCache = New MSXML2.XMLSchemaCache60
objSchemaCache.Add "", objXSD
' XSD XML Bind
Set xmlDoc.Schemas = objSchemaCache
'Error visualization
Dim objErr As MSXML2.IXMLDOMParseError
Set objErr = xmlDoc.Validate()
If objErr.errorCode <> 0 Then
Debug.Print "Error parser: " & objErr.errorCode & "; " & objErr.reason
Else
Debug.Print "No errors found"
End If
Set objErr = Nothing
Set objXSD = Nothing
Set objSchemaCache = Nothing
Set xmlDoc = Nothing
End Sub
The XSD file can be modified but the XML file must remain untouchable.
XSD 文件可以修改,但 XML 文件必须保持不可更改。
I've been trying to solve this issue for more than 8 hours with no positive result.
我已经尝试解决这个问题超过 8 个小时,但没有任何积极的结果。
Any help will be greatly appreciated.
任何帮助将不胜感激。
回答by Tomalak
Try adding the namespace URI to the schema cache.
尝试将命名空间 URI 添加到架构缓存。
Sub XSD_Validation()
Dim xmlDoc As MSXML2.DOMDocument60
Dim objSchemaCache As New XMLSchemaCache60
Dim objErr As MSXML2.IXMLDOMParseError
objSchemaCache.Add "http://somewhere.com/root", LoadXmlFile("I:\Test.xsd")
Set xmlDoc = LoadXmlFile("I:\Test.xml")
Set xmlDoc.Schemas = objSchemaCache
Set objErr = xmlDoc.Validate()
If objErr.errorCode = 0 Then
Debug.Print "No errors found"
Else
Debug.Print "Error parser: " & objErr.errorCode & "; " & objErr.reason
End If
End Sub
Function LoadXmlFile(Path As String) As MSXML2.DOMDocument60
Set LoadXmlFile = New MSXML2.DOMDocument60
With LoadXmlFile
.async = False
.validateOnParse = False
.resolveExternals = False
.load Path
End With
End Function
回答by Petru Gardea
You shouldn't have to change anything in your xml/xsd, since together they are valid. The problem is in your code, so I would suggest to take a look at this samplethat shows what I think is different than your code: when you add the XSD to the cache, use the target namespace http://somewhere.com/rootinstead of the empty string.
您不必更改 xml/xsd 中的任何内容,因为它们一起是有效的。问题出在您的代码中,因此我建议查看此示例,该示例显示了我认为与您的代码不同的内容:将 XSD 添加到缓存时,请使用目标命名空间http://somewhere.com/ root而不是空字符串。

