Print

Currently allmost each XML document use namspaces in its contents. This prevents name conflicts in the case when multiple document types are used. DOM provides special methods for extracting XML-element and atttributes by their fully qualified names,i.e. with namespaces supplied.

During namespace processing DOM operates on vendor URL. The sample below shows an example of namespace usage:

This is a sample XML using namespaces:

<?xml version="1.0"?>

<!DOCTYPE myns:purchase-order  [
	<!ELEMENT myns:purchase-order (myns:purchased-by, myns:order-items)>
	<!ATTLIST myns:purchase-order
		myns:date   CDATA #REQUIRED
		myns:number CDATA #REQUIRED
		xmlns:myns  CDATA #REQUIRED
	>

	<!ELEMENT pmyns:purchased-by (myns:address)>
	<!ATTLIST myns:purchased-by
	   myns:name CDATA #REQUIRED
	>
	<!ELEMENT myns:address (#PCDATA)>

	<!ELEMENT myns:order-items (myns:item+)>
	<!ELEMENT myns:item EMPTY>
	<!ATTLIST myns:item
		myns:code  CDATA #REQUIRED
		myns:type  CDATA #REQUIRED
		myns:label CDATA #REQUIRED
	>
]>

<myns:purchase-order xmlns:myns="http://www.my-company.com" 
	myns:date="2005-10-31" myns:number="12345">

	<myns:purchased-by myns:name="My name">
		<myns:address>My address</myns:address>
	</myns:purchased-by>

	<myns:order-items>
		<!--
			here is an example of empty element
			i.e. containing no nested elements
		-->
		<myns:item myns:code="687" myns:type="CD" 
			myns:label="Some music" />
		<myns:item myns:code="129851" myns:type="DVD" 
			myns:label="Some video"/>
	</myns:order-items>

</myns:purchase-order>

This is a Java code refering namespaces:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

/**
 * This sample program using fully qualified names while
 * accessing the contents of DOM-document.
 */

public class Test {
  public static void main(String[] args) {
    try {
      // load the document from a file:
      DocumentBuilderFactory factory = 
        DocumentBuilderFactory.newInstance();
      factory.setNamespaceAware(true);
      factory.setValidating(true);

      DocumentBuilder loader = factory.newDocumentBuilder();
      Document document = loader.parse("sample.xml");

      // here is our vendor URL used in namepace-related functions:
      String docNS = "http://www.my-company.com";

      Element order = document.getDocumentElement();

      // here we get the attribute with namespace defined:
      Attr date = order.getAttributeNodeNS(docNS, "date");
      // .. do something ...

      // here we get the attribute with namespace defined:
      NodeList children = order.getElementsByTagNameNS(docNS, "item");
      // .. do something ...

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

Parent Category: Java SE Tips