如何为含两个命名空间的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
相关产品推荐
相关产品推荐

