【问题标题】:Add a unique id to an element located inside multiple child elements in XML schema向位于 XML 模式中多个子元素内的元素添加唯一 ID
【发布时间】:2023-04-01 06:15:01
【问题描述】:

我正在尝试创建一个 XML 模式,以便为位于 XML 中的多个子元素内的元素提供唯一的 id。在这种情况下,一个元素是“actor”,它位于“actors”内,而“actors”又位于“cast”元素内。

我希望每个电影 ID 都是唯一的,并且每个演员 ID 在该电影 ID 中都是唯一的。我不确定我需要为位于“actors”和“cast”子元素内的“actor”元素放置“唯一”。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<movie_database
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="test.xsd">

<movie movieID="1">
    <title>Movie 1</title>
    <cast>
        <directors>Bob</directors>
        <writers>Tom</writers>      
        <actors>
            <actor actorID="1"> 
                <name>Jack</name>
            </actor>
            <actor actorID="2">
                <name>James</name>
            </actor>
        </actors>   
    </cast>
</movie>
</movie_database>

XML 架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">

    <xs:element name="movie_database">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="movie" type="movietype" minOccurs="1" maxOccurs="unbounded">
                <xs:unique name="unique_actorid">
                    <xs:selector xpath="actor"/>
                    <xs:field xpath="@actorID"/>
                </xs:unique>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="unique_movieid">
        <xs:selector xpath="movie"/>
        <xs:field xpath="@movieID"/>
    </xs:unique>
    </xs:element>

    <xs:complexType name="movietype">
        <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="cast" type="casttype"/>
        </xs:sequence>
        <xs:attribute name="movieID" type="xs:integer"/>
    </xs:complexType>

    <xs:complexType name="casttype">
        <xs:sequence>
            <xs:element name="directors" type="xs:string"/>
            <xs:element name="writers" type="xs:string"/>
            <xs:element name="actors" type="actorsAll"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="actorsAll">
        <xs:sequence>
            <xs:element name="actor" type="actorType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="actorType" mixed="true">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="actorID" type="xs:integer"/>
    </xs:complexType>

</xs:schema>

【问题讨论】:

    标签: xml xsd schema unique


    【解决方案1】:

    一般规则是&lt;xs:unique&gt; 位于最顶部的元素上,该元素给出了您需要唯一性的范围,选择器给出了从该点向下到应该唯一的元素的路径,以及字段是相对于所选元素的。

    因此,对于电影中的独特演员,您有几个选择。由于每个movie 都恰好有一个cast,而actors 又恰好有一个actors,您可以使用actor 的选择器将约束放在actors 元素上,使用actors/actor 的选择器或在电影上带有cast/actors/actor 的选择器。在所有情况下,字段 xpath 都是 @actorID,因为它与选定的 actor 元素相关。

    顺便说一句,您提供的架构只允许一部电影有一个演员,我猜您忘记了 actorsAllactor 元素上的 maxOccurs="unbounded"

    【讨论】:

    • 这很完美!我实际上已经尝试使用演员/演员/演员的选择器对电影施加约束,但是因为我忘记了 maxOccurs="unbounded" 我不断收到“这个元素不是预期的”错误,所以我永远不知道是否该约束有效。现在一切都说得通了。非常感谢!
    猜你喜欢
    • 2013-01-23
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多