Espaços de nomes

Esta tradução está incompleta. Por favor, ajude a traduzir este artigo do Inglês.

 

Em adição a este documento, consulte Namespaces Crash Course.

Espaços de nomes XML fornecem uma maneira para distinguir nomes duplicados de elementos e atributos. Os nomes de elementos e atributos duplicados podem ocorrer quando um documento XML contém elementos e atributos de dois ou mais esquemas XML diferentes (ou DTDs). para citar Wikipédia: "Em geral, um espaço de nome é um recipiente abstrato que fornece contexto para os itens... este contém e permite a desambiguação de itens com o mesmo nome."

If you are familiar with C++ namespaces, Java packages, perl packages, or Python module importing, you are already familiar with the namespace concept.

An XML namespace is identified by an unique name (called a URI, not a URL, even though it can look like a URL). An URI is any string, although most people choose a URL-based URI because URLs are an easy way to hope for uniqueness. Although there's nothing preventing someone else from using the namespace http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul, it's fairly unlikely anyone would choose that accidentally. Even if they did accidentally choose it, they may not define the same elements as XUL anyway (e.g., <textbox/>) in their schema/DTD.

Any element type or attribute name in an XML namespace can be uniquely identified by its XML namespace and its "local name". Together, these two items define a qualified name, or QName.

For example, <xul:textbox/> uses a namespace named "xul" and a local name "textbox". This distinguishes it from, for example, <foobar:textbox/> which might occur in the same document. The xul and foobar namespaces must be defined at the top of the XML document in which they are used, like so:

 <foobar:some-element 
     xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
     xmlns:foobar="the-foobar-namespace">
   <xul:textbox id="foo" value="bar"/>
   <foobar:textbox favorite-food="pancakes"/>
 </foobar:some-element>

Notice I've mixed two <textboxes/> in the same document. The only way to distinguish that they have different meanings is with namespaces.

There's only one other thing to know: "default namespace". Every XML element has a "default namespace", and this is used with XUL elements all the time. In XUL documents, you'll usually see this:

 <window
     id="foo"
     xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
   ...
   ...
 </window>

and in XHTML documents, you'll see this:

 <html xmlns="http://www.w3.org/1999/xhtml">
   ...
   ...
 </html>

There is a very subtle difference here than before. Before I wrote xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" but here the :xul piece is omitted. This signifies to the XML parser that http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul is the default namespace for the element and its descendant elements (unless further overridden by a default namespace on a descendant element), and that any element without a namespace (i.e., no prefix and colon) belongs to the default namespace. That's why we can write the shorthand <textbox/> instead of <xul:textbox/> in XUL (although the latter is just as correct when not using http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul as the default namespace) -- the XUL namespace is defined as the default on the topmost element. In other words, a default namespace permits a kind of short-hand to be used for all descendants of an element.

Here's a question: what namespace contains the element foo in the XML document below?

  <foo/>

The answer is that it's in no namespace, or alternately, it's in the namespace denoted by the empty string:

  <foo xmlns=""/>

This second example is semantically equivalent to the first.

Now, a second question: what namespaces are the bar, baz, and quux attributes in?

  <foo bar="value">
    <element xmlns="namespace!" baz="value">
      <element quux="value"/>
    </element>
  </foo>

bar is obviously not in a namespace. What about baz and quux? The answer is that they aren't in a namespace either. In fact no unprefixed attribute is ever in a namespace, primarily because XML originally didn't have namespaces, and all XML from that time had to stay in no namespace. This is a source of perennial confusion for XML namespaces.

Etiquetas do documento e contribuidores

Etiquetas: 
 Contribuidores para esta página: chrisdavidmills, mansil
 Última atualização por: mansil,