Namespace usage

In the previous chapter, we made quite a few references to namespaces. Jabber's namespaces are used within the message elements to qualify payloads (distinct content) within these elements. For example:

RECV: <iq id='roster_0' type='result' from='dj@yak/Work'>
        <query xmlns='jabber:iq:roster'>
          <item jid='sabine@yak' name='sabine' subscription='both'>
            <group>Family</group>
          </item>
        </query>
      </iq>

Here the jabber:iq:roster namespace is being used to qualify a chunk of XML that contains roster information embedded in an <iq/> element. A payload exists as a subelement of the main element (that is, a child tag of the parent <message/>, <presence/> or <iq/> tag) and, in XML terms, belongs to a different namespace than the main element.

The namespace of the main elements in the XML document that is streamed across the connection—<message/>, <presence/>, and <iq/>, and indeed their "standard" subelements, such as <message/>'s <subject/> tag—is defined in the root tag of the XML document, and in this case is jabber:client. Namespaces like jabber:client that are used to qualify such XML document body fragments are described in the section called The Opening Tag in Chapter 5. While the main elements in our client to server connection are qualified by jabber:client, each distinct payload (“attachment” is also a good way to think of these additional chunks of XML) is qualified by one of the specific namespaces listed in this Chapter.

Jabber namespace naming rules

Standard Jabber namespaces begin jabber:; however, there are a few exceptions. It could be argued that the exceptions aren't really Jabber standard since these are the namespaces that describe things like vCards and XHTML payloads. There's nothing to stop you from defining your own namespaces to qualify any sort of XML you'd like to attach to a Jabber element. The only rule is that if you do, it shouldn't begin with jabber:.

Further to the rule that Jabber standard namespaces begin with jabber:, the categorization can be seen as falling into two distinct spaces. The first, the iq space, contains namespaces that qualify content within <iq/>-based conversations. The second, the x space, contains namespaces that qualify extensions within all the elements (<message/>, <iq/>, and <presence/>).