XML Schema 为多个子元素添加唯一的 id

标签 xml validation schema unique

我有一个存储电影及其 Actor 的 XML 文件。有 2 个 movie 元素(+ 它们的 movieID 属性),每个元素包含 2 个 actorID。每个 actorID 还包含 known_for/movies/movie它也有一个 movieID。

我已经成功地使“主要”movieID 变得唯一,并且 actorID 在该 movieID 中也变得唯一。不过,我也想把movieID放在known_for/movies/movie里面元素在其相应的 actorID 中是唯一的。我有点困惑我需要在哪里定义唯一的 id

known_for/movies/movie  movieID 

它可能必须去 <xs:element name="movies 内部的某个地方,我只是不太确定具体在哪里。

这是我的 XML 文件

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

<movie movieID="1">
    <title>Movie 1</title>
    <cast>
        <actors>
            <actor actorID="1"> 
                <name>Jack</name>
                <known_for>
                    <movies>
                        <movie movieID="1">Movie 1</movie>
                        <movie movieID="2">Movie 2</movie>
                        <movie movieID="3">Movie 3</movie>
                    </movies>
                </known_for>
            </actor>
            <actor actorID="2">
                <name>James</name>
                <known_for>
                    <movies>
                        <movie movieID="1">Movie 1</movie>
                        <movie movieID="2">Movie 2</movie>
                        <movie movieID="3">Movie 3</movie>
                    </movies>
                </known_for>
            </actor>
        </actors>   
    </cast>
</movie>

<movie movieID="2">
    <title>Movie 2</title>
    <cast>
        <actors>
            <actor actorID="1"> 
                <name>Jack</name>
                <known_for>
                    <movies>
                        <movie movieID="1">Movie 1</movie>
                        <movie movieID="2">Movie 2</movie>
                        <movie movieID="3">Movie 3</movie>
                    </movies>
                </known_for>
            </actor>
            <actor actorID="2">
                <name>James</name>
                <known_for>
                    <movies>
                        <movie movieID="1">Movie 1</movie>
                        <movie movieID="2">Movie 2</movie>
                        <movie movieID="3">Movie 3</movie>
                    </movies>
                </known_for>
            </actor>
        </actors>   
    </cast>
</movie>
</movies>

这是我的架构

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

    <xs:element name="movies">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="movie" type="movieType" maxOccurs="unbounded">
                    <xs:unique name="unique_actorID">
                        <xs:selector xpath="cast/actors/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" use="required"/>
    </xs:complexType>

    <xs:complexType name="castType">
        <xs:sequence>
            <xs:element name="actors" type="actorsAll">
            </xs:element>
        </xs:sequence>
    </xs:complexType>

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

    <xs:complexType name="actorType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="known_for" type="known_forGroup" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="actorID" type="xs:integer" use="required"/>
    </xs:complexType>

    <xs:complexType name="known_forGroup">
        <xs:sequence>
            <xs:element name="movies" type="known_forType"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="known_forType">
        <xs:sequence>
            <xs:element name="movie" type="known_forMovies" maxOccurs="unbounded">
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="known_forMovies">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="movieID" type="xs:integer"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

</xs:schema>

最佳答案

我通过向位于“actorType”内的“known_for”元素添加唯一 ID 解决了该问题

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

    <xs:element name="movies">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="movie" type="movieType" maxOccurs="unbounded">
                    <xs:unique name="unique_actorID">
                    <xs:selector xpath="cast/actors/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" use="required"/>
</xs:complexType>

<xs:complexType name="castType">
    <xs:sequence>
        <xs:element name="actors" type="actorsAll">
        </xs:element>
    </xs:sequence>
</xs:complexType>

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

<xs:complexType name="actorType">
    <xs:sequence>
        <xs:element name="name" type="xs:string"/>
        <xs:element name="known_for" type="known_forGroup" minOccurs="0">
            <xs:unique name="unique_known_for_movieID">
                <xs:selector xpath="movies/movie"/>
                <xs:field xpath="@movieID"/>
            </xs:unique>
        </xs:element>
    </xs:sequence>
    <xs:attribute name="actorID" type="xs:integer" use="required"/>
</xs:complexType>

<xs:complexType name="known_forGroup">
    <xs:sequence>
        <xs:element name="movies" type="known_forType"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="known_forType">
    <xs:sequence>
        <xs:element name="movie" type="known_forMovies" maxOccurs="unbounded">
        </xs:element>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="known_forMovies">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="movieID" type="xs:integer"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

</xs:schema>

关于XML Schema 为多个子元素添加唯一的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15509504/

相关文章:

java - LinearLayout 不显示项目

字符串 base64 的 javax.validation 注释

javascript - 隐藏部分表格

validation - 使用 goplayground 验证器库验证结构数组

sql-server - 数据库架构比较错误 : 'Version store out of memory'

mysql - 如何在不更改其中数据的情况下将表的架构从一个数据库导入到另一个数据库中的现有表?

java - Flying Saucer 无法识别 html 实体

android - 无法膨胀 ColorStateList,将其留给框架 java.lang.UnsupportedOperationException : Can't convert to color: type=0x2

sql - 设置 sql 查询的默认架构

sql - 如何从 SQL Server 2008 返回 XML,该 XML 的结构具有多个选择共享一个公共(public)父级