# XML Namespaces Oga fully supports registering XML namespaces and querying elements using these namespaces, including alternative default namespaces. Namespaces can be registered in two ways: 1. Namespaces defined in the document itself (e.g. `xmlns:foo="..."`) 2. By using {Oga::XML::Element#register\_namespace} Note that manually registering namespaces does not alter the input document when serialized back to XML. To do so you'll have to manually add the corresponding attributes using {Oga::XML::Element#set}. ## Document Namespaces Documents can contain two types of namespaces: 1. Named namespaces 2. Default namespaces The first are registered as following: Here we register a new namespace with prefix "foo" and URI "http://foo.com". Default namespaces are registered in a similar fashion, except they come without a prefix: ## Manually Registered Namespaces If you ever want to register a namespace yourself, without having to first change the input document, you can do so as following: element = Oga::XML::Element.new(:name => 'root') element.register_namespace('foo', 'http://foo.com') Trying to register an already existing namespace will result in `ArgumentError` being raised. ## Listing Namespaces To query all the namespaces available to an element you can use {Oga::XML::Element#available\_namespaces}. This method returns a Hash containing all {Oga::XML::Namespace} instances available to the element. The keys are the namespace prefixes, the values the Namespace instances. Inner namespaces overwrite outer namespaces. Example: element = Oga::XML::Element.new(:name => 'root') element.register_namespace('foo', 'http://foo.com') element.available_namespaces # => {"foo" => Namespace(name: "foo", uri: "http://foo.com")}