Xml 未找到DTD/架构声明

Xml 未找到DTD/架构声明,xml,vba,xsd,xsd-validation,xml-validation,Xml,Vba,Xsd,Xsd Validation,Xml Validation,这是我从这里得到的示例XML: 但这并没有改变任何事情 简化示例: 我将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" x

这是我从这里得到的示例XML:

但这并没有改变任何事情

简化示例:

我将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\minichema.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"
使用

也就是说,使用一对空格分隔的

另见


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

  • XSD缺少
    targetNamespace
  • XSD引用了lhd:finanzjahr,但没有定义它
  • XML不使用URL符号来引用XSD
我强烈建议您将问题分解为:

  • 使用已知的有效验证器(而不是您自己的代码)获取一个最小XML文件,并根据最小XSD文件进行验证

  • 使用您自己的代码获得上面的最小对

  • 对实际的XML和XSD重复1-2


  • 在这个答案的帮助下,我解决了我的问题。这是我使用的代码:

    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
    
    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
    
    Dim objSchemaCache
    设置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"
    暗docum
    Set docum=CreateObject(“MSXML2.DOMDocument.6.0”)
    调用docum.Load(“C:\Temp\LHD-V55-Monat-beispel.xml”)
    设置docum.Schemas=objSchemaCache
    暗光雷达
    设置dParseError=docum.validate()
    停止
    如果dParseError.ErrorCode为0,则
    调用MsgBox(“Fehler”&dParseError.ErrorCode&“:”&dParseError.Reason&“bei-XML-Validierung.”)
    如果结束
    设置dParseError=docum.validateNode(docum.ChildNodes.Item(1))
    停止
    如果dParseError.ErrorCode为0,则
    调用MsgBox(“Fehler”&dParseError.ErrorCode&“:”&dParseError.Reason&“bei-XML-Validierung.”)
    如果结束
    

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

    很抱歉,使用xsi:schemaLocation=“xsi:schemaLocation=”“”没有任何区别。我会将此编辑到我的问题中。您的评论中的
    xsi:schemaLocation
    与我在此答案中建议的不匹配。@kjhughes:这是因为在评论中显示的链接不同。看看我编辑的问题。这是我使用的一行。好的,但请注意,您可以(也应该)使用记号标记来格式化注释中的代码,以避免此类问题。如果此快速抽查修复程序不适用于您,您需要创建一个以可复制方式显示问题的。期望有人试图帮助您浏览或查找大量的
    import
    include
    依赖项(即使它们都可以访问)是不合理的。
    <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="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"
    
    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