XML Namespaces
Avoiding element name conflicts in XML
🌐 What are XML Namespaces?
XML namespaces prevent element name conflicts by providing unique identifiers. They allow you to use elements from different vocabularies in the same document without confusion or naming collisions.
<!-- Namespace example -->
<root xmlns:book="http://example.com/books">
<book:title>XML Guide</book:title>
</root>
Explanation:
The xmlns:book declares a namespace prefix, making book:title unique.
Key Namespace Concepts
Prefix
Short name for namespace
<h:table xmlns:h="http://www.w3.org/html">
URI
Unique namespace identifier
xmlns="http://example.com/schema"
Default
Namespace without prefix
<root xmlns="http://default.com">
Scope
Applies to element and children
<parent xmlns:p="uri">
<p:child/>
</parent>
🔹 Why Use Namespaces?
Namespaces solve the problem of element name conflicts when combining XML from different sources. They ensure each element has a unique identity.
<!-- Without namespaces - CONFLICT! -->
<document>
<table>Furniture</table> <!-- HTML table? Data table? -->
</document>
<!-- With namespaces - CLEAR! -->
<document
xmlns:h="http://www.w3.org/html"
xmlns:f="http://example.com/furniture">
<h:table>
<h:tr><h:td>Data</h:td></h:tr>
</h:table>
<f:table>Wooden Desk</f:table>
</document>
Result:
Now it's clear: h:table is an HTML table, f:table is furniture.
🔹 Declaring Namespaces
Namespaces are declared using the xmlns attribute. You can declare them with or without a prefix depending on your needs.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Namespace with prefix -->
<books xmlns:bk="http://example.com/books">
<bk:book>
<bk:title>Learning XML</bk:title>
<bk:author>John Smith</bk:author>
</bk:book>
</books>
<!-- Default namespace (no prefix) -->
<books xmlns="http://example.com/books">
<book>
<title>Learning XML</title>
<author>John Smith</author>
</book>
</books>
Note:
Default namespaces apply to all child elements automatically.
🔹 Multiple Namespaces
You can use multiple namespaces in a single document to combine elements from different XML vocabularies seamlessly.
<?xml version="1.0"?>
<catalog
xmlns:book="http://example.com/books"
xmlns:music="http://example.com/music">
<book:item id="B001">
<book:title>XML Basics</book:title>
<book:author>Jane Doe</book:author>
<book:price>29.99</book:price>
</book:item>
<music:item id="M001">
<music:title>Symphony No. 5</music:title>
<music:artist>Beethoven</music:artist>
<music:price>14.99</music:price>
</music:item>
</catalog>
Benefit:
Both items have "title" and "price" elements, but they're distinguished by their namespace prefixes.
🔹 Namespace URI
The namespace URI is just an identifier - it doesn't need to point to an actual web page. It's simply a unique string to identify the namespace.
Important Points:
- URIs are identifiers, not locations
- They must be unique to avoid conflicts
- Often use domain names you control
- Case-sensitive and must match exactly
- Can be any string, but URLs are conventional
<!-- Valid namespace URIs -->
<root xmlns="http://mycompany.com/schema/2024">
<root xmlns="urn:mycompany:products:v1">
<root xmlns="http://www.w3.org/1999/xhtml">
<!-- These are DIFFERENT namespaces -->
<root xmlns="http://example.com">
<root xmlns="http://Example.com"> <!-- Different case! -->