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

Ner*_*dio 21 xml xsd xml-validation xml-error

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

这是我的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>
Run Code Online (Sandbox Code Playgroud)

我写了一个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>
Run Code Online (Sandbox Code Playgroud)

Schema代表了我真正的XML结构.

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

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

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

有人可以建议我做错了吗.

Ner*_*dio 21

感谢上面的每个人,但现在已经修复了.为了其他人的利益,最重要的错误是如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>
Run Code Online (Sandbox Code Playgroud)

而且,这是Schema

<?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>
Run Code Online (Sandbox Code Playgroud)

再次感谢大家,我希望将来对其他人有用.

  • 如果我可以对你的答案提出一些改进建议:你应该取消我的答案,等待我认为的一天,然后接受你的,因为从技术上讲,你的答案包含所有的修复; 我还会修复你URN的NID部分,它是无效的(删除`.`,它是NID的无效字符)并且还添加了强制的NSS部分,由另一个`:`分隔.schemaLocation只是一个提示,XSD感知验证器可以自由地忽略它,如果不是出于安全原因 - 这就是为什么它永远不应该是XML无效的原因. (4认同)

Ian*_*rts 19

cvc-elt.1:找不到元素'Root'的声明.[7]

schemaLocation应该在根元素上使用属性xsi:schemaLocation,并且需要修复它以使用正确的命名空间.

您应该更改targetNamespace模式和xmlns文档的http://myNameSpace.com格式(因为名称空间应该是有效的URI,但Test.Namespace不是,但urn:Test.Namespace这样就可以了).一旦你这样做,它应该找到架构.关键是,模式的所有三个目标命名空间,文档的命名空间以及您为其提供模式位置的命名空间必须相同.

(尽管它仍然不会验证,因为您在模式所需的文档中<element2>包含了一个)<element3>item

  • 我已根据您的建议更正了以下内容,现在它可以正常运行"三个"命名空间的澄清是我所需要的. (3认同)