如何为具有 2 个命名空间的 XML 文件创建架构

How to make a schema for an XML file with 2 namespaces

提问人:André Miguel Monteiro 提问时间:7/4/2023 最后编辑:Amira BedhiafiAndré Miguel Monteiro 更新时间:7/4/2023 访问量:47

问:

我想为这个XML文件制作一个XSD:

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

我看到了一种可能性,即我使用一个主 XSD 为accao导入一个XSD,为comedia导入另一个XSD,但我无法执行一个可以验证此XML的架构。

XML XSD 命名空间

评论


答:

1赞 Amira Bedhiafi 7/4/2023 #1

您可能需要为“acao”和“comedia”命名空间创建单独的 XSD,并将它们导入到主 XSD 中。

首先为“acao”命名空间创建名为“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">

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

然后为“comedia”命名空间创建第二个“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">

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

最后创建主 XSD 文件(“filmes.xsd”):

<?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"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           targetNamespace="http://exemplo.com/filmes"
           elementFormDefault="qualified">

  <!-- Import the acao and comedia namespaces -->
  <xs:import namespace="http://exemplo.com/acao" schemaLocation="acao.xsd"/>
  <xs:import namespace="http://exemplo.com/comedia" schemaLocation="comedia.xsd"/>

  <!-- Define the root element -->
  <xs:element name="filmes">
    <xs:complexType>
      <xs:sequence>
        <!-- Reference the elements from the imported namespaces -->
        <xs:element ref="acao:filme" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="comedia:filme" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

“ref” 属性用于引用导入的 XSD 中的元素。

评论

1赞 Yitzhak Khabinsky 7/4/2023
我修改了“anoLancamento”,即发布年份,以成为更精确的数据类型。xs:gYear