Um espaço de nomes XML é uma coleta de nomes, identificados por uma referência de URI, que são utilizados em documentos XML como tipos de elementos e nomes de atributos.
O atributo xmlns possui a seguinte sintaxe:
xmlns:prefix=namespace
em que namespace é um URI exclusivo (como www.ibm.com) e em que prefix representa o espaço de nomes e fornece um ponteiro para ele.
Na definição de elemento de cliente a seguir, um espaço de nomes de contabilidade está definido para poder distinguir as tags de elementos das que aparecem em registros de clientes criados por outros aplicativos de negócios:
<acct:customer xmlns:acct="http://www.my.com/acct-REV10"> <acct:name>Corporation</acct:name> <acct:order acct:ref="5566"/> <acct:status>invoice</acct:status> </acct:customer>
A definição de espaço de nomes na primeira linha designa o espaço de nomes http://www.my.com/acct-REV10 para o prefixo. Este prefixo é utilizado em nomes de elementos, como um nome para anexá-los ao espaço de nomes. Um segundo aplicativo, por exemplo, um sistema de preenchimento, pode designar um espaço de nomes diferente a seus elementos de clientes:
<ful:customer xmlns:ful="http://www.your.com/ful"> <ful:name>Corporation</ful:name> <ful:order ful:ref="A98756"/> <ful:status>shipped</ful:status> </ful:customer>
Um aplicativo que processa as duas estruturas de dados agora pode tratar a contabilidade e os dados de preenchimento de forma diferente. Existe um espaço de nomes padrão. Ele será configurado se nenhum nome local estiver designado na definição de espaço de nomes:
<acct:customer xmlns="http://www.my.com/acct-REV10" xmlns:acct="http://www.my.com/acct-REV10 "> <name>Corporation</name> <order acct:ref="5566"/> <status>invoice</status> </customer>
Neste exemplo, todas as tags no registro de clientes estão qualificadas para residir no espaço de nomes http://www.my.com/acct-REV10. Nenhum prefixo explícito é requerido, porque é utilizado o espaço de nomes padrão. Observe que o espaço de nomes padrão se aplica a quaisquer definições de atributos.
No esquema XML a seguir, o espaço de nomes padrão para o esquema está definido como o espaço de nomes de esquema XML padrão http://www.w3.org/2001/XMLSchema; existe também um espaço de nomes específico de esquema http://www.ibm.com.
<?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:TestSchema="http://www.ibm.com"> <simpleType name="ZipCodeType"> <restriction base="integer"> <minInclusive value="10000"/> <maxInclusive value="99999"/> </restriction> </simpleType> <!--element definitions skipped --> </schema>
Assumindo que o esquema XML anterior tenha sido salvo como C:\temp\TestSchema.xsd, um arquivo XML de mostra que é validado neste esquema é:
<?xml version="1.0"?>
<x:addressList xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
<x:address>
<x:street>x:Vangerowstrasse</x:street>
<x:zipCode>69115</x:zipCode>
<x:city>x:Heidelberg</x:city>
</x:address>
<x:address>
<x:street>x:Bernal Road</x:street>
<x:zipCode>90375</x:zipCode>
<x:city>x:San Jose</x:city>
</x:address>
</x:addressList>
O espaço de nomes de destino serve para identificar o espaço de nomes no qual existe a associação entre o elemento e seu nome. No caso de declarações, esta associação determina o espaço de nomes dos elementos em arquivos XML que estão de acordo com o esquema. Um arquivo XML que importa um esquema deve fazer referência a seu espaço de nomes de destino no atributo schemaLocation. Quaisquer incompatibilidades entre o espaço de nomes de destino e o real de um elemento são relatadas como erros de validação de esquema. Em nosso exemplo, o espaço de nomes de destino é http://www.ibm.com; ele está definido no arquivo esquema XML e referido duas vezes no arquivo XML. Qualquer incompatibilidade entre estas três ocorrências do espaço de nomes gera erros de validação.
Os exemplos a seguir mostram como os espaços de nomes de destino e os prefixos de espaço de nomes funcionam em esquemas XML e em seus documentos da instância XML correspondente.
O esquema XML:
<?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com"> <complexType name="AddressType"> <sequence> <element name="name" type="string"></element> </sequence> </complexType> <element name="MyAddress" type="x:AddressType"></element> </schema>
Um documento da instância XML válido criado a partir deste esquema é semelhante ao seguinte. Os elementos e atributos locais não não qualificados.
<?xml version="1.0"?> <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com x.xsd "> <name>Peter Smith</name> </x:MyAddress>
Quando elementos locais (como o elemento "name") e atributos são não qualificados em um arquivo XML, apenas o elemento raiz é qualificado. Portanto, neste exemplo, o prefixo de espaço de nomes "x" é designado ao elemento raiz "MyAddress", associando-o ao espaço de nomes "http://www.ibm.com", mas o prefixo "x" não é designado ao elemento local "name".
<?xml version="1.0"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com" elementFormDefault="qualified"> <complexType name="AddressType"> <sequence> <element name="name" type="string"></element> </sequence> </complexType> <element name="MyAddress" type="x:AddressType"></element> </schema>
Um documento da instância XML válido criado a partir deste esquema é semelhante ao seguinte. Os elementos e atributos locais são qualificados Isto ocorre porque o atributo elementFormDefault está configurado como qualificado no esquema XML.
<?xml version="1.0"?> <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com x.xsd "> <x:name>Peter Smith</x:name> </x:MyAddress>
Neste exemplo, o prefixo de espaço de nomes "x" é designado ao elemento raiz "MyAddress" e ao elemento local "name", associando-os ao espaço de nomes "http://www.ibm.com",.
Este esquema XML inclui este atributo:
xmlns:xsd="http://www.w3.org/2001/XMLSchemaIsto significa que cada uma das construções definidas pela linguagem de esquema XML precisará ser qualificada com o prefixo "xsd". Por exemplo, xsd:complexType e xsd:string
. Observe que é possível escolher outros prefixos como "xs" ou "foobar" em sua declaração e uso.
É possível especificar este prefixo na página de preferências do esquema XML. Para obter informações adicionais, consulte as tarefas relacionadas.
Todos os tipos definidos pelo usuário pertencem ao espaço de nomes http://www.ibm.com, conforme definido pelo atributo targetNamespace e o prefixo é "x", conforme definido pelo atributo xmlns:x.
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com"> <xsd:complexType name="AddressType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:element name="MyAddress" type="x:AddressType"></xsd:element> </xsd:schema>
Um documento da instância XML válido criado a partir deste esquema é semelhante ao seguinte. Os elementos e atributos locais não não qualificados. A semântica de qualificação é a mesma da Amostra 1.
<?xml version="1.0"?> <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com x.xsd "> <name>Peter Smith</name> </x:MyAddress>
Este esquema XML não possui um espaço de nomes de destino para ele mesmo. Neste caso, é altamente recomendável que todas as construções de esquema XML sejam explicitamente qualificadas com um prefixo como "xsd". As definições e declarações deste esquema, como AddressType, são referidas sem qualificação de espaço de nomes, pois não existe nenhum prefixo de espaço de nomes.
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="AddressType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"></xsd:element> <xsd:element name="name" type="xsd:string"></xsd:element> <xsd:element name="name" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:element name="MyAddress" type="AddressType"></xsd:element> </xsd:schema>
Um documento da instância XML válido criado a partir do esquema é semelhante ao seguinte. Todos os elementos são unqualified.
<?xml version="1.0"?> <MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd"> <name>name</name> </MyAddress>
Este é um esquema XML no qual o espaço de nomes de destino é o espaço de nomes padrão. Além disso, o espaço de nomes não possui nenhum prefixo de espaço de nomes.
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns="http://www.ibm.com"> <xsd:complexType name="AddressType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"></xsd:element> </xsd:sequence> </xsd:complexType> <xsd:element name="MyAddress" type="AddressType"></xsd:element> </xsd:schema>
Um documento da instância XML válido criado a partir do esquema é semelhante ao seguinte:
<?xml version="1.0" encoding="UTF-8"?> <MyAddress xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com NewXMLSchema.xsd"> <name>name</name> </MyAddress>