XML Schema验证:找不到元素的声明

35

我对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>

我编写了一个模式,它在这里:

<?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]

我认为这可能与根元素的命名空间有关,但我不确定。

请问有人能建议我哪里出错了吗?

4个回答

32

感谢以上所有人,但现在已经修复。为了其他人的利益,最重要的错误是将三个命名空间与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>

再次感谢大家,希望这对未来的某个人有所帮助。


4
如果我可以对你的答案提出一些建议:你应该取消接受我的答案,等待一天后再接受你的答案,因为从技术上讲,你的答案包含了所有修复; 我也会修复你 URN 中无效的 NID 部分(删除 . 是一个无效的字符),并且添加必需的 NSS 部分,由另一个 : 分隔。 schemaLocation 只是一个提示,XSD 感知验证器可以自由忽略它,如果不是出于安全原因-这就是为什么它永远不应该是 XML 无效或有效的原因。 - Petru Gardea
这对我很有帮助,我也轻松地学会了命名空间问题。谢谢。 - prem30488

26
你的根元素上的schemaLocation属性应该为xsi:schemaLocation,并且你需要修复它以使用正确的命名空间。 你可能需要更改模式的targetNamespace和文档的xmlns为http://myNameSpace.com(因为命名空间应该是有效的URI,Test.Namespace不是,虽然urn: Test。Namespace就可以了)。一旦你这样做了,它就应该找到模式了。重点是,模式的目标命名空间、文档的命名空间和你给出模式位置的命名空间必须相同。 (虽然它仍无法验证,因为你的在文档中包含一个,而模式期望是)

3
我已根据你的建议进行了更正,现在它可以正常工作了。“三个”命名空间的说明是我所需要的。 - Nerdio
“noNameSpaceSchemaLocation”的含义是什么?当我从亚马逊文档中复制输入.xml时,它有“noNameSpaceSchemaLocation”,但显示错误。阅读此评论后,我将其更改为“schemaLocation”,现在不会显示任何错误。但是,“noNameSpaceSchemaLocation”是什么? - Shashank Gupta

1
你的XML Schema的targetNamespaceRoot元素的命名空间不匹配(在Test.Namespace中是点,而在Test,Namespace中是逗号)。
一旦你解决了上述问题,你需要考虑你的element2有一个在XSD中不存在的属性order

感谢您的帮助并指出两个明显的错误。我已经纠正了这些错误;'code' <?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> 'code'(抱歉,我似乎没有正确插入代码)。问题仍然存在... - Nerdio

0

我的错误是拥有多个根节点,这些节点是通过我点击“快速修复”时由vscode/codium添加的。

enter image description here

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

enter image description here

当我将鼠标悬停在“Feed”(在您的情况下是“Root”)上时,显示了错误信息。

enter image description here

最终,针对 xsd 的 xml 模式验证代码表明,添加额外的第二行是错误的 XML。 相反,我不应该关注第一个截图中的三个灰点 / 快速修复,XML 从一开始就是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接