Espaços de nome XML

Um espaço de nome XML consiste num conjunto de nomes, identificados por uma referência URI, que são utilizados em documentos XML como tipos de elemento e nomes de atributo.

Os espaços de nomes XML são definidos por uma recomendação W3C, com a data do dia 14 de Janeiro de 1999, denominada Espaços de nomes em XML. Os nomes dos identificadores XML deverão ser, de uma forma geral, exclusivos, bem como curtos, por uma questão de desempenho. Para solucionar este conflito, a recomendação W3C do espaço de nomes define um atributo xmlns, que pode corrigir todos os elementos XML. Caso esteja presente num elemento, identifica o espaço de nomes deste elemento.

O atributo xmlns tem a seguinte sintaxe:

xmlns:prefix=namespace

em que namespace é um URI exclusivo (tal como www.ibm.com) e em que prefix representa o espaço de nomes e faculta um apontador para este.

Na seguinte definição do elemento de cliente, é definido um espaço de nomes de contabilidade para ser possível efectuar a distinção entre os identificadores de elemento e os que são apresentados nos registos de clientes criados por outras aplicações empresariais:

<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 atribui o espaço de nomes http://www.my.com/acct-REV10 ao prefixo. Este prefixo é utilizado nos nomes de elementos como, por exemplo, nome, de modo a anexá-los ao espaço de nomes. Uma segunda aplicação como, por exemplo, um sistema de preenchimento, pode atribuir um espaço de nomes diferente a elementos de cliente:

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

Uma aplicação que processe ambas as estruturas de dados poderá agora considerar a contabilidade e o preenchimento de modos distintos. Existe um espaço de nomes predefinido. Será definido caso não seja atribuído nenhum nome local 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, todos os identificadores no registo de clientes estão qualificados para residir no espaço de nomes http://www.my.com/acct-REV10. Não é necessário qualquer prefixo explícito, uma vez que é utilizado o espaço de nomes predefinido. Tenha em atenção que o espaço de nomes predefinido se aplica a todas as definições de atributos.

Esquemas XML e espaços de nomes

No seguinte esquema XML, o espaço de nomes predefinido do esquema é definido como o espaço de nomes padronizado do esquema XML http://www.w3.org/2001/XMLSchema. Existe igualmente um espaço de nomes específico do 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>  

Partindo do princípio que o esquema XML é guardado como C:\temp\TestSchema.xsd, segue-se um exemplo de um ficheiro XML que é validado em comparação com este 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> 

Espaço de nomes destino

O espaço de nomes destino serve para identificar o espaço de nomes no qual existe a associação entre o elemento e o respectivo nome. No caso de declarações, esta associação determina o espaço de nomes dos elementos nos ficheiros XML que estão em conformidade com o esquema. Um ficheiro XML que efectue a importação de um esquema deverá fazer referência ao respectivo espaço de nomes destino no atributo schemaLocation. Todas as disparidades entre o espaço de nomes destino e o espaço de nomes efectivo de um elemento são reportados como erros de validação de esquema. No exemplo apresentado, o espaço de nomes destino é http://www.ibm.com: está definido no ficheiro do esquema XML e é referenciado duas vezes no ficheiro XML. Qualquer disparidade entre estas três ocorrências do espaço de nomes originam erros de validação.

Os exemplos seguintes apresentam o modo de funcionamento de espaços de nomes destino e de prefixos de espaço de nomes em esquemas XML e os documentos da ocorrência XML correspondentes.

Exemplo 1 - Um esquema com um espaço de nomes predefinido e destino e locais não qualificados

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 válido de uma ocorrência XML criado a partir deste esquema assemelha-se ao seguinte. Os elementos e os atributos locais sã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 os elementos locais (como o elemento "nome") e os atributos não estão qualificados num ficheiro XML, apenas é qualificado o elemento raiz. Como tal, neste exemplo, o prefixo "x" do espaço de nomes é atribuído ao elemento raiz "MyAddress", associando-o ao espaço de nomes "http://www.ibm.com", mas o prefixo "x" não está atribuído ao elemento local "name".

Exemplo 2 - Um esquema com um espaço de nomes predefinido e destino e locais qualificados

<?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 válido de uma ocorrência XML criado a partir deste esquema assemelha-se ao seguinte. Os elementos e os atributos locais estão qualificados. Isto deve-se ao facto de o atributo elementFormDefault estar definido 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 "x" do espaço de nomes é atribuído ao elemento raiz "MyAddress" e ao elemento local "name", associando-os ao espaço de nomes "http://www.ibm.com",.

Exemplo 3 - Esquema com espaço de nomes destino e que define de forma explícita xmlns:xsd

Este esquema XML adiciona o seguinte atributo:

xmlns:xsd="http://www.w3.org/2001/XMLSchema

Isto significa que cada uma das construções definidas pelo idioma do esquema XML terão de ser qualificadas com o prefixo "xsd". Por exemplo, xsd:complexType e xsd:string

. Tenha em atenção que poderá escolher quaisquer outros prefixos como "xs" ou "foobar" na declaração e utilização.

É possível especificar este prefixo na página de preferências do esquema XML. Para obter mais informações, consulte as tarefas relacionadas.

Todos os tipos definidos pelo utilizador pertencem ao espaço de nomes http://www.ibm.com, conforme definido pelo atributo targetNamespace e o prefixo é "x", tal como 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 válido de uma ocorrência XML criado a partir deste esquema assemelha-se ao seguinte. Os elementos e os atributos locais são não qualificados.A semântica da qualificação é a mesma do Exemplo 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>

Exemplo 4 - Esquema com espaço de nomes destino não declarado que define de forma explícita xmlns:xsd

Este esquema XML não possui espaço de nomes destino próprio. Neste caso, recomenda-se vivamente que todas as construções do esquema XML sejam qualificadas de forma explícita com um prefixo como, por exemplo, "xsd". As definições e declarações deste esquema como AddressType são referenciadas sem qualificação de espaço de nomes, uma vez que não existe um 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 válido de uma ocorrência XML criado a partir do esquema assemelha-se ao seguinte. Todos os elementos são não qualificados.

<?xml version="1.0"?>
<MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd">
<name>name</name>
</MyAddress>

Exemplo 5 - Um esquema em que o espaço de nomes destino corresponde ao espaço de nomes predefinido

Este é um esquema XML em que o espaço de nomes destino corresponde ao espaço de nomes predefinido. O espaço de nomes não possui igualmente 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 válido de uma ocorrência XML criado a partir do esquema assemelha-se 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>  
Tarefas relacionadas
Editar preferências de ficheiros de esquema XML