You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含两个命名空间的XML文件创建可验证的XSD Schema?

多命名空间XML的XSD验证实现方案

原始XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<filmes xmlns:acao="http://exemplo.com/acao"
        xmlns:comedia="http://exemplo.com/comedia"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="to be completed">

 <acao:filme>
    <acao:titulo>Velozes e Furiosos</acao:titulo>
    <acao:diretor>Rob Cohen</acao:diretor>
    <acao:atorPrincipal>Vin Diesel</acao:atorPrincipal>
    <acao:anoLancamento>2001</acao:anoLancamento>
  </acao:filme>

  <comedia:filme>
    <comedia:titulo>Se Beber, Não Case!</comedia:titulo>
    <comedia:diretor>Todd Phillips</comedia:diretor>
    <comedia:atorPrincipal>Bradley Cooper</comedia:atorPrincipal>
    <comedia:anoLancamento>2009</comedia:anoLancamento>
  </comedia:filme>

</filmes>

要实现该XML的验证,需拆分三个XSD文件:分别对应acao、comedia命名空间的子XSD,以及定义根元素filmes的主XSD,具体实现如下:

1. 编写acao命名空间的XSD(acao.xsd)

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

    <!-- 定义acao:filme元素结构 -->
    <xs:element name="filme">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="titulo" type="xs:string"/>
                <xs:element name="diretor" type="xs:string"/>
                <xs:element name="atorPrincipal" type="xs:string"/>
                <xs:element name="anoLancamento" type="xs:gYear"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

2. 编写comedia命名空间的XSD(comedia.xsd)

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

    <!-- 定义comedia:filme元素结构 -->
    <xs:element name="filme">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="titulo" type="xs:string"/>
                <xs:element name="diretor" type="xs:string"/>
                <xs:element name="atorPrincipal" type="xs:string"/>
                <xs:element name="anoLancamento" type="xs:gYear"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

3. 编写主XSD文件(filmes.xsd)

主XSD需导入两个子命名空间的XSD,同时定义根元素filmes,允许包含任意数量的acao:filme和comedia:filme元素:

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

    <!-- 导入acao命名空间的XSD -->
    <xs:import namespace="http://exemplo.com/acao" schemaLocation="acao.xsd"/>
    <!-- 导入comedia命名空间的XSD -->
    <xs:import namespace="http://exemplo.com/comedia" schemaLocation="comedia.xsd"/>

    <!-- 定义根元素filmes结构 -->
    <xs:element name="filmes">
        <xs:complexType>
            <xs:choice maxOccurs="unbounded">
                <xs:element ref="acao:filme"/>
                <xs:element ref="comedia:filme"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

4. 修改XML的schemaLocation属性

将原始XML中的xsi:schemaLocation替换为完整的命名空间与XSD路径映射(若三个XSD和XML在同一目录下,直接写文件名即可):

<?xml version="1.0" encoding="UTF-8"?>
<filmes xmlns:acao="http://exemplo.com/acao"
        xmlns:comedia="http://exemplo.com/comedia"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="
            http://exemplo.com/acao acao.xsd
            http://exemplo.com/comedia comedia.xsd
            . filmes.xsd">

 <acao:filme>
    <acao:titulo>Velozes e Furiosos</acao:titulo>
    <acao:diretor>Rob Cohen</acao:diretor>
    <acao:atorPrincipal>Vin Diesel</acao:atorPrincipal>
    <acao:anoLancamento>2001</acao:anoLancamento>
  </acao:filme>

  <comedia:filme>
    <comedia:titulo>Se Beber, Não Case!</comedia:titulo>
    <comedia:diretor>Todd Phillips</comedia:diretor>
    <comedia:atorPrincipal>Bradley Cooper</comedia:atorPrincipal>
    <comedia:anoLancamento>2009</comedia:anoLancamento>
  </comedia:filme>

</filmes>

关键注意事项

  • 子XSD必须明确指定targetNamespace为对应命名空间,且elementFormDefault="qualified"确保子元素也归属该命名空间
  • 主XSD必须使用<xs:import>而非<xs:include>,因为涉及不同命名空间的导入
  • XML的schemaLocation需为每个命名空间指定对应XSD文件路径,根元素filmes属于无命名空间,用.(当前目录)映射到主XSD

内容的提问来源于stack exchange,提问作者André Miguel Monteiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:17:34