【问题标题】:XML Schema Validation : Cannot find the declaration of elementXML 模式验证:找不到元素的声明
【发布时间】:2013-03-26 16:15:42
【问题描述】:

我对 XML Schema 等还有些陌生,并且一直致力于开发一些 XML、Schema 和样式表 (XSLT)。我已经取得了合理的进展,但后来意识到我的 Schema 已经停止工作,所以我把它带回到一个更简单的非描述性示例。

这是我的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="Test.Namespace"  
      schemaLocation="http://myNameSpace.com Test1.xsd">
    <element1 id="001">
        <element2 id="001.1">
             <element3 id="001.1" />
        </element2>
    </element1>
</Root>

我在这里写了一个 Schema:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="item" type="element3Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element3Type">
         <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
 </xsd:schema>

Schema 代表了我的真实 XML 的结构。

现在,当我尝试验证我的 XML 时,我收到了这个错误:

cvc-elt.1: Cannot find the declaration of element 'Root'. [7]

我认为这与 Root 元素上的命名空间问题有关,但我真的不确定。

请有人建议我做错了什么。

【问题讨论】:

    标签: xml xsd xml-validation xml-error


    【解决方案1】:

    感谢以上所有人,但现在已解决此问题。为了其他人的利益,最严重的错误是按照 Ian 的建议对齐三个命名空间。

    为了完整起见,这里是更正的 XML 和 XSD

    这里是 XML,错别字已更正(对于迟到造成的任何混淆,请见谅)

    <?xml version="1.0" encoding="UTF-8"?>
    
    <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="urn:Test.Namespace"  
          xsi:schemaLocation="urn:Test.Namespace Test1.xsd">
        <element1 id="001">
            <element2 id="001.1">
                <element3 id="001.1" />
            </element2>
        </element1>
    </Root>
    

    还有,这里是架构

    <?xml version="1.0"?>
    
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                targetNamespace="urn:Test.Namespace"
                xmlns="urn:Test.Namespace"
                elementFormDefault="qualified">
        <xsd:element name="Root">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
                </xsd:sequence>
            </xsd:complexType>
        </xsd:element>
           
        <xsd:complexType name="element1Type">
            <xsd:sequence>
                <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
            </xsd:sequence>
            <xsd:attribute name="id" type="xsd:string"/>
        </xsd:complexType>
           
        <xsd:complexType name="element2Type">
            <xsd:sequence>
                <xsd:element name="element3" type="element3Type"/>
            </xsd:sequence>
            <xsd:attribute name="id" type="xsd:string"/>
        </xsd:complexType>
    
        <xsd:complexType name="element3Type">
            <xsd:attribute name="id" type="xsd:string"/>
        </xsd:complexType>        
    </xsd:schema>
    

    再次感谢大家,希望以后对其他人有用。

    【讨论】:

    • 如果我可以建议对您的答案进行一些改进:您应该不接受我的答案,等待一天我认为,然后接受您的答案,因为从技术上讲,您的答案包含所有修复;我还将修复 URN 中无效的 NID 部分(删除对 NID 无效的 .)并添加强制 NSS 部分,由另一个 : 分隔。 schemaLocation 只是一个提示,支持 XSD 的验证器可以随意忽略它,如果不是出于安全原因 - 这就是为什么它永远不应该成为 XML 无效或无效的原因。
    • 这对我帮助很大,而且我也很容易了解命名空间问题。谢谢。
    【解决方案2】:

    cvc-elt.1:找不到元素“根”的声明。 [7]

    根元素上的schemaLocation 属性应该是xsi:schemaLocation,您需要修复它以使用正确的命名空间。

    您可能应该将架构的targetNamespace 和文档的xmlns 更改为http://myNameSpace.com(因为命名空间应该是有效的URI,而Test.Namespace 不是,尽管urn:Test.Namespace 会是行)。一旦你这样做,它应该找到模式。关键是架构的目标命名空间、文档的命名空间和您为其提供架构位置的命名空间这三个必须相同。

    (尽管它仍然无法验证,因为您的 &lt;element2&gt; 在架构期望 item 的文档中包含 &lt;element3&gt;

    【讨论】:

    • 我已按照您的建议更正了以下内容,现在它可以工作了。我需要澄清“三个”命名空间。
    • noNameSpaceSchemaLocation 是什么意思?当我从 Amazon Documentation 复制 input.xml 时,它有 noNameSpaceSchemaLocation 但它显示错误。阅读此评论后,我将其更改为schemaLocation,现在它没有显示任何错误。但是noNameSpaceSchemaLocation 是什么?
    【解决方案3】:

    您的 XML 架构的 targetNamespaceRoot 元素的命名空间不匹配(Test.Namespace 中的点与Test,Namespace 中的逗号)

    一旦您同意上述内容,您必须考虑到您的element2 有一个属性 order 不在您的 XSD 中。

    【讨论】:

    • 感谢您,并发现了两个明显的错误。我已经更正了这些; 'code' w3.org/2001/XMLSchema-instance" xmlns="Test.Namespace" schemaLocation="myNameSpace.comTest1.xsd" > 'code' (抱歉,我好像没有插入代码正确)。问题依旧……
    【解决方案4】:

    我的错误是有多个根节点,当我点击“快速修复”时,vscode/codium已经添加了:

    并选择在第二行显示 XML 模式(这是错误的,因为这 导致两个起始节点):

    并将鼠标悬停在“Feed”(在您的情况下为“Root”)向我显示了错误。

    最后,xml针对xsd的schema验证代码显示,添加额外的第二行是错误的xml。相反,我不应该介意第一个屏幕截图中的三个灰点/快速修复,XML 从一开始就是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2012-07-02
      • 2012-06-07
      • 2015-07-04
      相关资源
      最近更新 更多