MSXML VBA-使用多个导入的名称空间根据XSD验证XML文档
到目前为止,为了验证XML文件,我使用了Notepad++。下面的XML似乎验证得很好(同样在LiquidStudios和我检查过的任何其他XML验证工具中): 让我觉得疯狂的是,“walidujXML”子文件按预期工作,当我生成XML文件时,将其保存在本地,然后从本地路径将其加载到子文件中。但是,当我在XML生成子部分的最后一步使用它并将XML作为参数传递到XML验证子部分时,它会抛出如下错误: 元素上的属性“schemaLocation” '{http://crd.gov.pl/wzor/2020/03/16/9199/}“Deklaracja”未定义 在DTD/Schema中。 属性的{http://crd.gov.pl/xml/schematy/dziedzinowe/mf/2013/05/23/eD/KodyCECHKRAJOW/}柯德 元素上的“Waluty” '{http://crd.gov.pl/wzor/2020/03/16/9199/}“瓦托斯卡”未在中定义 DTD/模式 我非常感谢您对我(在许多其他验证错误中)收到以下消息的原因的任何反馈:MSXML VBA-使用多个导入的名称空间根据XSD验证XML文档,xml,vba,validation,xsd,msxml,Xml,Vba,Validation,Xsd,Msxml,到目前为止,为了验证XML文件,我使用了Notepad++。下面的XML似乎验证得很好(同样在LiquidStudios和我检查过的任何其他XML验证工具中): 让我觉得疯狂的是,“walidujXML”子文件按预期工作,当我生成XML文件时,将其保存在本地,然后从本地路径将其加载到子文件中。但是,当我在XML生成子部分的最后一步使用它并将XML作为参数传递到XML验证子部分时,它会抛出如下错误: 元素上的属性“schemaLocation” '{http://crd.gov.pl/wzor/2
<?xml version="1.0" encoding="UTF-8"?>
<tns:Deklaracja xmlns:tns="http://crd.gov.pl/wzor/2020/03/16/9199/">
<tns:Naglowek>
<tns:KodFormularza kodSystemowy="TPR-C (2)" kodPodatku="CIT" rodzajZobowiazania="Z" wersjaSchemy="1-0E">TPR-C</tns:KodFormularza>
<tns:WariantFormularza>2</tns:WariantFormularza>
<tns:CelZlozenia>1</tns:CelZlozenia>
<tns:OkresOd>2020-01-01</tns:OkresOd>
<tns:OkresDo>2020-12-31</tns:OkresDo>
<tns:KodUrzedu>0000</tns:KodUrzedu>
</tns:Naglowek>
<tns:Podmiot1 rola="Podmiot składający">
<tns:NIP>11111111112</tns:NIP>
<tns:PelnaNazwa>test 1</tns:PelnaNazwa>
<tns:KodPKD>2313Z</tns:KodPKD>
<tns:KodKraju>PL</tns:KodKraju>
</tns:Podmiot1>
<tns:Podmiot2 rola="Podmiot, dla którego jest składana informacja">
<tns:NIP>11111111112</tns:NIP>
<tns:PelnaNazwa>TEST 2</tns:PelnaNazwa>
<tns:KodPKD>2313Z</tns:KodPKD>
</tns:Podmiot2>
<tns:PozycjeSzczegolowe>
<tns:PodmiotNZ>ZK01</tns:PodmiotNZ>
<tns:InnyPodmiot>
<tns:MarzaOper>5.17</tns:MarzaOper>
<tns:MarzaZysku>4.88</tns:MarzaZysku>
<tns:RentAkt>7.18</tns:RentAkt>
<tns:RentKW>46.59</tns:RentKW>
</tns:InnyPodmiot>
<tns:Transakcja>
<!--1/A-->
<tns:KategoriaA>1009</tns:KategoriaA>
<tns:WartoscA kodWaluty="PLN">10</tns:WartoscA>
<tns:TNieZwolniona>ZW02</tns:TNieZwolniona>
<tns:Kraj>PL</tns:Kraj>
<tns:Metoda01>MW01</tns:Metoda01>
<tns:CenaMin kodWaluty="PLN">1</tns:CenaMin>
<tns:CenaMax kodWaluty="PLN">2</tns:CenaMax>
<tns:Miara>tona</tns:Miara>
<tns:Weryfikacja>SW01</tns:Weryfikacja>
<tns:CenaPorMin kodWaluty="PLN">1</tns:CenaPorMin>
<tns:CenaPorMax kodWaluty="PLN">2</tns:CenaPorMax>
</tns:Transakcja>
</tns:PozycjeSzczegolowe>
</tns:Deklaracja>
Public Sub walidujXML(docxml As MSXML2.DOMDocument60)
Dim SCHEMA_NAMESPACE_MAIN As String
Dim SCHEMA_LOCATION_MAIN As String
SCHEMA_NAMESPACE_MAIN = "http://crd.gov.pl/wzor/2020/03/16/9199/"
SCHEMA_LOCATION_MAIN = "http://crd.gov.pl/wzor/2020/03/16/9199/schemat.xsd"
Dim objSchemaCache As New XMLSchemaCache60
Dim objErr As MSXML2.IXMLDOMParseError2
objSchemaCache.Add SCHEMA_NAMESPACE_MAIN, SCHEMA_LOCATION_MAIN
With docxml
.async = False
.validateOnParse = False
.resolveExternals = False
Set .Schemas = objSchemaCache
.SetProperty "MultipleErrorMessages", True
Set objErr = .Validate()
End With
Dim oErr As Object
If objErr.allErrors.Length = 0 Then MsgBox "nie ma błędów!"
Dim stringBledy As String
If objErr.allErrors.Length > 0 Then
For Each oErr In objErr.allErrors
stringBledy = stringBledy & oErr.reason & vbNewLine
Next oErr
MsgBox "W uzupełnionych polach znaleziono błędy:" & vbNewLine & vbNewLine & stringBledy
End If
End Sub