1

我正在尝试理解<any>xsd 中的元素。我有两个xsd。

图书目录.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> 

审稿人.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>
4

1 回答 1

4

两种选择...

选项一:如果您不想拥有p:Reviewerpresent的定义,请添加processContents="lax"到您的xs:any元素:

      <xs:any namespace="##any" minOccurs="0"  processContents="lax"/>

Per XML Schema Part 0: Primer Second Edition :

processContents 属性的松散值指示 XML 处理器在可行的基础上验证元素内容:它将验证它可以获取模式信息的元素和属性,但对于无法获取任何模式的元素和属性不会发出错误信号信息。

另请参阅Java 中的 XML 验证:processContents=“lax”似乎无法正常工作

您还应该仔细调整您的xsi:schemaLocation值以指向每个运行中的每个命名空间的每个 XSD 的实际文件名。这是您的 XML 实例,其中包含我所做的更改:

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

注意:确保targetNamespaceReview.xsd 中的内容与 BookCatalogue.xmlxsi:schemaLocation属性中为其声明的内容相匹配。

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

于 2013-09-30T20:11:55.927 回答