cvc-complex-type.2.4.c:匹配的通配符是strict,但是找不到声明

时间:2013-09-30 19:39:06

标签: xsd xsd-validation

我想了解xsd中的<any>元素。我有两个xsds。

Book Catalogue.xsd

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com"
    elementFormDefault="qualified">
    <xs:element name="BookCatalogue">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Book" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Title" type="xs:string" />
                            <xs:element name="Author" type="xs:string" />
                            <xs:element name="Date" type="xs:string" />
                            <xs:element name="ISBN" type="xs:string" />
                            <xs:element name="Publisher" type="xs:string" />
                            <xs:any namespace="##any" minOccurs="0" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema> 

Reviewer.xsd

<?xml version="1.0" encoding="ISO-8859-1"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com"
    elementFormDefault="qualified">

    <xs:element name="Reviewer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Name">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="First" type="xs:string" />
                            <xs:element name="Last" type="xs:string" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>



</xs:schema> 

但是如果我根据上面的xsd验证下面的xml,我得到 cvc-complex-type.2.4.c:匹配的通配符是严格的,但是找不到元素'p:Reviewer'的声明。错误。两个xsd文件都不应该在同一个命名空间中吗?

<?xml version="1.0" encoding="UTF-8"?>
<pr:BookCatalogue xmlns:pr="http://www.w3schools.com"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3schools.com AddRequest.xsd ">
    <pr:Book>
        <pr:Title>pr:Title</pr:Title>
        <pr:Author>pr:Author</pr:Author>
        <pr:Date>pr:Date</pr:Date>
        <pr:ISBN>pr:ISBN</pr:ISBN>
        <pr:Publisher>pr:Publisher</pr:Publisher>
        <p:Reviewer xmlns:p="http://www.w3schools.com"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.w3schools.com Children.xsd ">
            <p:Name>
                <p:First>p:First</p:First>
                <p:Last>p:Last</p:Last>
            </p:Name>
        </p:Reviewer>
    </pr:Book>
</pr:BookCatalogue>

1 个答案:

答案 0 :(得分:3)

两个选项......

选项一:如果您希望必须有p:Reviewer的定义,请将processContents="lax"添加到您的{{1}元素:

xs:any

XML Schema Part 0: Primer Second Edition

  

processContents属性的松弛值指示XML   处理器以can-do为基础验证元素内容:它会   验证可以获取模式的元素和属性   信息,但它不会为那些无法获得的信号发出错误信号   任何架构信息。

另见XML Validation in Java: processContents=“lax” seems not to work correctly

您还应该仔细调整 <xs:any namespace="##any" minOccurs="0" processContents="lax"/> 值,使其指向每个正在运行的命名空间的每个XSD的实际文件名。这是您的XML实例,其中包含我所做的更改:

xsi:schemaLocation

注意:确保Review.xsd中的<?xml version="1.0" encoding="UTF-8"?> <pr:BookCatalogue xmlns:pr="http://www.w3schools.com" xmlns:p="http://www.w3schools.com/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com BookCatalogue.xsd http://www.w3schools.com/1 Reviewer.xsd"> <pr:Book> <pr:Title>pr:Title</pr:Title> <pr:Author>pr:Author</pr:Author> <pr:Date>pr:Date</pr:Date> <pr:ISBN>pr:ISBN</pr:ISBN> <pr:Publisher>pr:Publisher</pr:Publisher> <p:Reviewer> <p:Name> <p:First>p:First</p:First> <p:Last>p:Last</p:Last> </p:Name> </p:Reviewer> </pr:Book> </pr:BookCatalogue> 与BookCatalogue.xml的targetNamespace属性中为其声明的内容匹配。

选项二:如果您 想要坚持xsi:schemaLocation的定义存在,只需进行上述更改以确保Review.xsd可以根据p:Reviewer机制找到。无需xsi:schemaLocation设置;它默认为processContents