【问题标题】:no DTD/Schema declaration was found未找到 DTD/Schema 声明
【发布时间】:2020-01-15 12:15:02
【问题描述】:

这是我从这里获得的示例 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

两个验证都返回错误:

  • 验证返回:

    节点既无效也不无效,因为没有找到 DTD/Schema 声明。
    (原文:“Der Knoten ist weder gültig noch ungültig, weil keine DTD/Schema-Deklaration gefunden wurde。”)

  • 验证节点返回:

    使用了元素“{http://www.statistik.gv.at/LHD-V55/Schema}kennsatz”,但未在 DTD/Schema 中声明。”
    (原文:“Das Element '{http://www.statistik.gv.at/LHD-V55/Schema}kennsatz' wird verwendet, aber esist 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”时,验证成功。 (消息框:“xml 是有效的”)。所以文件本身似乎是正确的。

我会错过一个电话吗?为什么 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>

错误和之前一样。

【问题讨论】:

    标签: xml vba xsd xsd-validation xml-validation


    【解决方案1】:

    您使用 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"
    

    即用空格分隔的对的

    xsi:schemaLocation="NAMESPACE_VALUE SCHEMA_LOCATION"
    

    另见How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?


    在您的简化示例中,有几个问题,至少包括:

    • XSD 缺少 targetNamespace。
    • XSD 引用了lhd:finanzjahr,但没有定义它。
    • XML 不使用 URL 表示法来引用 XSD。

    我的强烈建议是分解您的问题:

    1. 使用已知工作的验证器而不是您自己的代码,针对最小 XSD 文件获取最小 XML 文件。

    2. 使用您自己的代码获取上述最小对。

    3. 使用您的实际 XML 和 XSD 重复 1-2。

    【讨论】:

    • 我很遗憾地说,但使用 xsi:schemaLocation="xsi:schemaLocation="statistik.gv.at/LHD-V55/Schema statistik.at/GBS-Schema/LHD/LHD-V55_kennsatz-monat.xsd"" 没有任何区别。我将把它编辑成我的问题。
    • 您评论中的xsi:schemaLocation 与我在此答案中推荐的不符。
    • @kjhughes:这是因为在 cmets 中显示的链接不同。看看我编辑的问题。这是我使用的线。
    • 好的,但请注意,您可以(并且应该)使用刻度线来格式化 cmets 中的代码以避免此类麻烦。
    • 如果这个快速抽查修复对您不起作用,您需要创建一个minimal reproducible example,以可重现的方式显示问题。期望有人试图帮助您克服或追查大量 import 和 include 依赖项(即使它们都可以访问)是不合理的。
    【解决方案2】:

    在这个答案https://stackoverflow.com/a/11709428/9930052 的帮助下,我解决了我的问题。这是我使用的代码:

    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
    

    您必须将 Schema 单独加载到 XMLSchemaCache 中并在 DOMDocument 中进行设置。

    【讨论】:

      猜你喜欢
      • 2015-07-04
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多