未找到 DTD/Schema 声明
no DTD/Schema declaration was found
这是我从这里得到的示例 XML:http://www.statistik.at/GBS-Schema/Beispiel/LHD-V55-Monat-Beispiel.xml
<?xml version="1.0" encoding="UTF-8"?>
<lhd:kennsatz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
xsi:schemaLocation="http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd">
<lhd:finanzjahr>2020</lhd:finanzjahr>
<lhd:quartal>0</lhd:quartal>
<lhd:monat>12</lhd:monat>
<lhd:regkz>3</lhd:regkz>
<lhd:periode>m</lhd:periode>
<lhd:bundesland>Tirol</lhd:bundesland>
<lhd:verantwortlich>max Hasenfuß</lhd:verantwortlich>
<lhd:sachbearbeiter>Börti Fräli</lhd:sachbearbeiter>
<lhd:telefon>02275/4525684</lhd:telefon>
<lhd:email>boerti.fraenzli@steiermark.gv.at</lhd:email>
<lhd:version>LHD-V5.5</lhd:version>
<lhd:erstellt>2018-01-16</lhd:erstellt>
<lhd:finanzierungshaushalt>
<lhd:ansatz_uab>770</lhd:ansatz_uab>
<lhd:ansatz_ugl>000</lhd:ansatz_ugl>
<lhd:konto>5880</lhd:konto>
<lhd:konto_ugl>000</lhd:konto_ugl>
<lhd:mvag_fhh>3126</lhd:mvag_fhh>
<lhd:ord_aord>6</lhd:ord_aord>
<lhd:sektor>0000</lhd:sektor>
<lhd:ansatz_text>offizieller Ansatztext</lhd:ansatz_text>
<lhd:konto_text>offizieller Kontotext</lhd:konto_text>
<lhd:wert>9344974.61</lhd:wert>
</lhd:finanzierungshaushalt>
</lhd:kennsatz>
这是我使用的 VBA-代码:
Public Sub CheckLHDModule()
Dim docum
Set docum = CreateObject("MSXML2.DOMDocument.6.0")
Call docum.Load("C:\Temp\LHD-V55-Monat-Beispiel.xml")
Dim dParseError
Set dParseError = docum.validate()
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
Set dParseError = docum.validateNode(docum.ChildNodes.Item(1))
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
End Sub
两次验证return一个错误:
验证 returns:
The node is neither valid nor invalid because no DTD/Schema declaration was found.
(Original: "Der Knoten ist weder gültig noch ungültig, weil keine DTD/Schema-Deklaration gefunden wurde.")
验证节点returns:
The element '{http://www.statistik.gv.at/LHD-V55/Schema}kennsatz' is used but not declared in the DTD/Schema."
(Original: "Das Element '{http://www.statistik.gv.at/LHD-V55/Schema}kennsatz' wird verwendet, aber es ist im DTD/Schema nicht deklariert .")
两种情况下的错误代码都是-1072898035。
但在 http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd 中定义了元素 "kennsatz"。这是文件的当前内容:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
xmlns:t="http://www.statistik.gv.at/LHD-V55/Typen"
targetNamespace="http://www.statistik.gv.at/LHD-V55/Schema"
elementFormDefault="qualified">
<!-- Typdefinitionen importieren -->
<xs:import schemaLocation="LHD-V55_Typdefinitionen.xsd"
namespace="http://www.statistik.gv.at/LHD-V55/Typen"/>
<!-- Elementdefinitionen inkludieren -->
<xs:include schemaLocation="LHD-V55_Elementdefinitionen.xsd"/>
<xs:include schemaLocation="LHD-V55_finanzierungshaushalt.xsd"/>
<!-- Kennsatz -->
<xs:element name="kennsatz">
<xs:complexType>
<xs:sequence>
<xs:element ref="lhd:finanzjahr"/>
<xs:element name="quartal">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="monat">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0][1-9]|[1][0-2]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="regkz" type="t:REGKZ"/>
<xs:element name="periode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="m|M"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="bundesland" type="t:BUNDESLAND"/>
<xs:element name="verantwortlich" type="t:NAME"/>
<xs:element name="sachbearbeiter" type="t:NAME"/>
<xs:element ref="lhd:telefon"/>
<xs:element ref="lhd:email"/>
<xs:element ref="lhd:version"/>
<xs:element name="erstellt" type="xs:date"/>
<!-- Kindelemente -->
<xs:element ref="lhd:finanzierungshaushalt" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
当我用notepad++ XML-Tools插件验证"LHD-V55-Monat-Beispiel.xml"时,验证成功。 (消息框:"The xml is valid")。所以文件本身似乎是正确的。
我会错过电话吗?为什么 XML-文档未正确验证?
编辑:
我尝试使用:
xsi:schemaLocation="http://www.statistik.gv.at/LHD-V55/Schema http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
但它并没有改变任何东西。
简化示例:
我将 xml 的内容更改为:
<?xml version="1.0" encoding="UTF-8"?>
<lhd:kennsatz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
xsi:schemaLocation="http://www.statistik.gv.at/LHD-V55/Schema file:///C:/RadLokal/trunk/Test/Access/MiniSchema.xsd">
<lhd:finanzjahr>gogo</lhd:finanzjahr>
</lhd:kennsatz>
而文件内容:C:\RadLokal\trunk\Test\Access\MiniSchema.xsd为:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
targetNamespace="http://www.statistik.gv.at/LHD-V55/Schema"
elementFormDefault="qualified">
<xs:element name="kennsatz">
<xs:complexType>
<xs:sequence>
<xs:element name="finanzjahr" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
报错和之前一样
您正在使用 xsi:schemaLocation
,就好像它是 xsi:noNamespaceSchemaLocation
。
而不是
xsi:schemaLocation="http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
使用
xsi:schemaLocation="http://www.statistik.gv.at/LHD-V55/Schema
http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
即使用 space 分隔的 对 of
xsi:schemaLocation="NAMESPACE_VALUE SCHEMA_LOCATION"
另见 How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?
在你简化的例子中,有几个问题,至少包括:
- XSD 缺少一个
targetNamespace
。
- XSD 引用了
lhd:finanzjahr
但没有定义它。
- XML 不使用 URL 符号来引用 XSD。
我的强烈建议是分解您的问题:
获取最小 XML 文件,使用已知有效的验证器(而非您自己的代码)针对最小 XSD 文件进行验证。
使用您自己的代码获取上述最小对。
用实际的 XML 和 XSD 重复 1-2。
在这个答案的帮助下 我解决了我的问题。这是我使用的代码:
Dim objSchemaCache
Set objSchemaCache = CreateObject("MSXML2.XMLSchemaCache.6.0")
objSchemaCache.Add "http://www.statistik.gv.at/LHD-V55/Schema", "http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
Dim docum
Set docum = CreateObject("MSXML2.DOMDocument.6.0")
Call docum.Load("C:\Temp\LHD-V55-Monat-Beispiel.xml")
Set docum.Schemas = objSchemaCache
Dim dParseError
Set dParseError = docum.validate()
Stop
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
Set dParseError = docum.validateNode(docum.ChildNodes.Item(1))
Stop
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
您必须将架构单独加载到 XMLSchemaCache 中并在 DOMDocument 中进行设置。
这是我从这里得到的示例 XML:http://www.statistik.at/GBS-Schema/Beispiel/LHD-V55-Monat-Beispiel.xml
<?xml version="1.0" encoding="UTF-8"?>
<lhd:kennsatz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
xsi:schemaLocation="http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd">
<lhd:finanzjahr>2020</lhd:finanzjahr>
<lhd:quartal>0</lhd:quartal>
<lhd:monat>12</lhd:monat>
<lhd:regkz>3</lhd:regkz>
<lhd:periode>m</lhd:periode>
<lhd:bundesland>Tirol</lhd:bundesland>
<lhd:verantwortlich>max Hasenfuß</lhd:verantwortlich>
<lhd:sachbearbeiter>Börti Fräli</lhd:sachbearbeiter>
<lhd:telefon>02275/4525684</lhd:telefon>
<lhd:email>boerti.fraenzli@steiermark.gv.at</lhd:email>
<lhd:version>LHD-V5.5</lhd:version>
<lhd:erstellt>2018-01-16</lhd:erstellt>
<lhd:finanzierungshaushalt>
<lhd:ansatz_uab>770</lhd:ansatz_uab>
<lhd:ansatz_ugl>000</lhd:ansatz_ugl>
<lhd:konto>5880</lhd:konto>
<lhd:konto_ugl>000</lhd:konto_ugl>
<lhd:mvag_fhh>3126</lhd:mvag_fhh>
<lhd:ord_aord>6</lhd:ord_aord>
<lhd:sektor>0000</lhd:sektor>
<lhd:ansatz_text>offizieller Ansatztext</lhd:ansatz_text>
<lhd:konto_text>offizieller Kontotext</lhd:konto_text>
<lhd:wert>9344974.61</lhd:wert>
</lhd:finanzierungshaushalt>
</lhd:kennsatz>
这是我使用的 VBA-代码:
Public Sub CheckLHDModule()
Dim docum
Set docum = CreateObject("MSXML2.DOMDocument.6.0")
Call docum.Load("C:\Temp\LHD-V55-Monat-Beispiel.xml")
Dim dParseError
Set dParseError = docum.validate()
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
Set dParseError = docum.validateNode(docum.ChildNodes.Item(1))
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
End Sub
两次验证return一个错误:
验证 returns:
The node is neither valid nor invalid because no DTD/Schema declaration was found.
(Original: "Der Knoten ist weder gültig noch ungültig, weil keine DTD/Schema-Deklaration gefunden wurde.")验证节点returns:
The element '{http://www.statistik.gv.at/LHD-V55/Schema}kennsatz' is used but not declared in the DTD/Schema."
(Original: "Das Element '{http://www.statistik.gv.at/LHD-V55/Schema}kennsatz' wird verwendet, aber es ist im DTD/Schema nicht deklariert .")
两种情况下的错误代码都是-1072898035。
但在 http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd 中定义了元素 "kennsatz"。这是文件的当前内容:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
xmlns:t="http://www.statistik.gv.at/LHD-V55/Typen"
targetNamespace="http://www.statistik.gv.at/LHD-V55/Schema"
elementFormDefault="qualified">
<!-- Typdefinitionen importieren -->
<xs:import schemaLocation="LHD-V55_Typdefinitionen.xsd"
namespace="http://www.statistik.gv.at/LHD-V55/Typen"/>
<!-- Elementdefinitionen inkludieren -->
<xs:include schemaLocation="LHD-V55_Elementdefinitionen.xsd"/>
<xs:include schemaLocation="LHD-V55_finanzierungshaushalt.xsd"/>
<!-- Kennsatz -->
<xs:element name="kennsatz">
<xs:complexType>
<xs:sequence>
<xs:element ref="lhd:finanzjahr"/>
<xs:element name="quartal">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="monat">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0][1-9]|[1][0-2]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="regkz" type="t:REGKZ"/>
<xs:element name="periode">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="m|M"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="bundesland" type="t:BUNDESLAND"/>
<xs:element name="verantwortlich" type="t:NAME"/>
<xs:element name="sachbearbeiter" type="t:NAME"/>
<xs:element ref="lhd:telefon"/>
<xs:element ref="lhd:email"/>
<xs:element ref="lhd:version"/>
<xs:element name="erstellt" type="xs:date"/>
<!-- Kindelemente -->
<xs:element ref="lhd:finanzierungshaushalt" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
当我用notepad++ XML-Tools插件验证"LHD-V55-Monat-Beispiel.xml"时,验证成功。 (消息框:"The xml is valid")。所以文件本身似乎是正确的。
我会错过电话吗?为什么 XML-文档未正确验证?
编辑:
我尝试使用:
xsi:schemaLocation="http://www.statistik.gv.at/LHD-V55/Schema http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
但它并没有改变任何东西。
简化示例:
我将 xml 的内容更改为:
<?xml version="1.0" encoding="UTF-8"?>
<lhd:kennsatz xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
xsi:schemaLocation="http://www.statistik.gv.at/LHD-V55/Schema file:///C:/RadLokal/trunk/Test/Access/MiniSchema.xsd">
<lhd:finanzjahr>gogo</lhd:finanzjahr>
</lhd:kennsatz>
而文件内容:C:\RadLokal\trunk\Test\Access\MiniSchema.xsd为:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:lhd="http://www.statistik.gv.at/LHD-V55/Schema"
targetNamespace="http://www.statistik.gv.at/LHD-V55/Schema"
elementFormDefault="qualified">
<xs:element name="kennsatz">
<xs:complexType>
<xs:sequence>
<xs:element name="finanzjahr" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
报错和之前一样
您正在使用 xsi:schemaLocation
,就好像它是 xsi:noNamespaceSchemaLocation
。
而不是
xsi:schemaLocation="http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
使用
xsi:schemaLocation="http://www.statistik.gv.at/LHD-V55/Schema
http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
即使用 space 分隔的 对 of
xsi:schemaLocation="NAMESPACE_VALUE SCHEMA_LOCATION"
另见 How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?
在你简化的例子中,有几个问题,至少包括:
- XSD 缺少一个
targetNamespace
。 - XSD 引用了
lhd:finanzjahr
但没有定义它。 - XML 不使用 URL 符号来引用 XSD。
我的强烈建议是分解您的问题:
获取最小 XML 文件,使用已知有效的验证器(而非您自己的代码)针对最小 XSD 文件进行验证。
使用您自己的代码获取上述最小对。
用实际的 XML 和 XSD 重复 1-2。
在这个答案的帮助下 我解决了我的问题。这是我使用的代码:
Dim objSchemaCache
Set objSchemaCache = CreateObject("MSXML2.XMLSchemaCache.6.0")
objSchemaCache.Add "http://www.statistik.gv.at/LHD-V55/Schema", "http://www.statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"
Dim docum
Set docum = CreateObject("MSXML2.DOMDocument.6.0")
Call docum.Load("C:\Temp\LHD-V55-Monat-Beispiel.xml")
Set docum.Schemas = objSchemaCache
Dim dParseError
Set dParseError = docum.validate()
Stop
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
Set dParseError = docum.validateNode(docum.ChildNodes.Item(1))
Stop
If dParseError.ErrorCode <> 0 Then
Call MsgBox("Fehler " & dParseError.ErrorCode & ": '" & dParseError.Reason & "' bei XML-Validierung. ")
End If
您必须将架构单独加载到 XMLSchemaCache 中并在 DOMDocument 中进行设置。