【问题标题】:Import namespaces in XML schema在 XML 模式中导入命名空间
【发布时间】:2015-11-18 10:20:27
【问题描述】:

我有两个不同的 .xsd(“item”和“user”),我想使用导入将它们合并到一个 .xsd 中:这个新架构 (items.xsd) 将包含一个项目序列和一个用户.

问题是我在调用之前在命名空间中定义的类型的行中收到此错误:

src-resolve: 无法将名称 'i:item' 解析为 a(n) 'type 定义'组件。

另外,在 xml 中,我在根元素上收到此错误:

cvc-elt.1.a:找不到元素“items”的声明。

item.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="item"
     xmlns="item" elementFormDefault="qualified">
    <xsd:simpleType name="itemID">
        <xsd:restriction base="xsd:ID">
            <xsd:pattern value="AR[0-9][0-9][0-9][0-9]"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="item" xmlns:i="item">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="title" type="xsd:string"/>
                <xsd:element name="description">
                    <xsd:simpleType>
                        <xsd:restriction base="xsd:string">
                            <xsd:maxLength value="40"/>
                        </xsd:restriction>
                    </xsd:simpleType>
                </xsd:element>
                <xsd:element name="comments">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="comment" minOccurs="0" maxOccurs="100">
                            <xsd:complexType>
                                <xsd:sequence>
                                    <xsd:element name="comment_text">
                                        <xsd:simpleType>
                                            <xsd:restriction base="xsd:string">
                                                <xsd:maxLength value="75"/>
                                            </xsd:restriction>
                                        </xsd:simpleType>
                                    </xsd:element>
                                </xsd:sequence>
                                <xsd:attribute name="id_user" type="xsd:IDREF" use="required"/>
                                <xsd:attribute name="id_item" type="xsd:IDREF" use="required"/>
                            </xsd:complexType>
                        </xsd:element>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

user.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="user"  elementFormDefault="qualified" xmlns="user">
    <xsd:simpleType name="usrID">
        <xsd:restriction base="xsd:ID">
            <xsd:pattern value="[A-Z][0-9][0-9][0-9][0-9][0-9]"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="user" xmlns:u="user">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="alias" type="xsd:string"/>
                <xsd:element name="email" type="xsd:string"/>
            </xsd:sequence>
            <xsd:attribute name="id_user" type="userID" use="required"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

items.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:i="item"
   xmlns:u="user" targetNamespace="items" elementFormDefault="qualified">
    <xsd:import namespace="item" schemaLocation="item.xsd"  />
    <xsd:import namespace="user" schemaLocation="user.xsd" />
    <xsd:element name="items">
        <xsd:complexType>
            <xsd:sequence>
                <!-- ERROR HERE --> <xsd:element name="item" type="i:item" minOccurs="1" maxOccurs="unbounded"/>
                <xsd:element name="users">
                    <xsd:complexType>
                        <xsd:sequence>
                <!-- ERROR HERE --> <xsd:element name="user" type="u:user" minOccurs="1" maxOccurs="unbounded"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="url" type="xsd:string" use="required"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

items.xml

<!-- ERROR HERE --><items url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="items.xsd">
    <item id_item="AR0000">
        <title>
            Item title
        </title>
        <description>
            Item description
            </description>
            <comments>
                <comment id_user="A00000" id_item="AR0000">
                    <comment_text>
                        Text
                    </comment_text>
                </comment>
            </comments>
    </item>
    <users>
        <user id_user="A00000">
            <alias>
                User1 alias
            </alias>
            <email>
                user1@gmail.com
            </email>
        </user>
        <user id_user="A00001">
            <alias>
                User2 alias
            </alias>
            <email>
                user2@hotmail.com
            </email>
        </user>
    </users>
</items>

【问题讨论】:

  • items.xml 不是格式正确的文档 - 请更正它,否则我们将无法解析它。谢谢。

标签: xml xsd xml-namespaces


【解决方案1】:

第一次修复

src-resolve:无法将名称“i:item”解析为(n)“类型定义” 组件。

您只是想使用已经在其他模式中定义的元素。因此,您应该使用&lt;xsd:element ref="..."&gt;

您可以像这样更改&lt;!-- ERROR HERE --&gt;(在 items.xsd 架构中)附近的声明:

 <xsd:element ref="i:item" minOccurs="1" maxOccurs="unbounded"/>

<xsd:element ref="u:user" minOccurs="1" maxOccurs="unbounded"/>

因为在 &lt;xsd:element&gt; 上使用类型会假定您在别处定义了 xsd:simpleTypexsd:complexType

请注意 user.xsd 中有一个错字:您指的是一个名为 userID 的类型,但我认为正确的拼写是 usrID

第二次修复

第一轮

cvc-elt.1.a:找不到元素“items”的声明。

您需要将架构正确地附加到您的文档中,如下所示:

<items xmlns="items" url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items items.xsd">

由于您的架构的目标命名空间是“items”,因此需要声明添加xsi:schemaLocation 值,该值应为命名空间 uri,后跟一个空格,然后是架构文件 url。

此外,您的&lt;items&gt; 元素绑定到items 命名空间,因此我需要添加xmlns="items" 声明。

第二轮

一旦完成,就会出现一堆命名空间错误,因为您没有在输入 XML 中的 itemuser 相关元素上定义所有适当的命名空间。

其中一种方法是修复您的 XML 文档,如下所示(注意 &lt;item&gt;&lt;user&gt; 上的 XML 命名空间声明:

<?xml version="1.0" encoding="UTF-8"?>
<items xmlns="items" url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="items items.xsd">
    <item id_item="AR0000" xmlns="item">
        <title>
            Item title
        </title>
        <description>
            Item description
        </description>
        <comments>
            <comment id_user="A00000" id_item="AR0000">
                <comment_text>
                    Text
                </comment_text>
            </comment>
        </comments>
    </item>
    <users>
        <user id_user="A00000" xmlns="user">
            <alias>
                User1 alias
            </alias>
            <email>
                user1@gmail.com
            </email>
        </user>
        <user id_user="A00001" xmlns="user">
            <alias>
                User2 alias
            </alias>
            <email>
                user2@hotmail.com
            </email>
        </user>
    </users>
</items>

关于属性声明和 ID/IDREF 的一些问题仍然存在,我让您修复。 .

【讨论】:

    【解决方案2】:

    您不能将两个架构文档合并为一个架构文档,因为它们具有不同的目标命名空间。但也许这不是你想要做的:@potame 似乎对这个问题的理解完全不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-03
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 2013-01-20
      • 1970-01-01
      • 2014-03-03
      相关资源
      最近更新 更多