DomDemo.java

[down arrow] Download DomDemo.java source file
[down arrow] Scroll down to MyAddresses.xml
[down arrow] Scroll down to AddrBook.dtd

// This program shows how to parse "MyAddresses.xml" with DOM, by
// first removing ignorable white space.  Here we try to locate the value
// of the first NAME of the first ADDRESS.  This is done in two different
// ways.
//
// Adapted 11/2005 by Wayne Pollock, Tampa Florida USA
//
// Citation:
// Listing: 8.3 From a JavaWorld article, Java Pitfalls #4, by Michael Daconta
// http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-traps_p.html

import javax.xml.parsers.*;
import java.io.*;
import org.w3c.dom.*;

class DomDemo
{
   public static boolean isBlank ( String buf )
   {
      if ( buf == null )
         return false;
      int len = buf.length();
      for ( int i=0; i < len; ++i )
      {
         char c = buf.charAt( i );
         if ( ! Character.isWhitespace(c) )
            return false;
      }
      return true;
   }

   public static void normalizeDocument ( Node n )
   {
      if ( ! n.hasChildNodes() )
         return;

      NodeList nl = n.getChildNodes();
      for ( int i = 0; i < nl.getLength(); ++i )
      {
         Node cn = nl.item( i );
         if ( cn.getNodeType() == Node.TEXT_NODE && isBlank(cn.getNodeValue()) )
         {
            n.removeChild( cn );
            --i;
         }
         else 
            normalizeDocument( cn );
      } 
   }

   public static Element getFirstChildElement ( Element elem )
   {
      if ( ! elem.hasChildNodes() )
         return null;

      for ( Node cn = elem.getFirstChild(); cn != null; cn = cn.getNextSibling() )
      {
         if ( cn.getNodeType() == Node.ELEMENT_NODE )
            return (Element) cn;
      } 
      return null;
   }


   public static void main ( String [] args )
   {
      try
      {
         if ( args.length != 1 )
         {
            System.out.println( "USAGE: java DomDemo xmlfile" );
            System.exit( 1 );
         }

         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document doc = db.parse( new File(args[0]) );

         // Get first Name of first Address Method 1 (look for elements):

         System.out.println( "Method #1: Skip over white-space Nodes..." );

         NodeList nl = doc.getElementsByTagName( "ADDRESS" );

         int count = nl.getLength();
         System.out.println( "\t# of \"ADDRESS\" elements: " + count );

         if ( count > 0 )
         {
            // Get the first ADDRESS node:
            Node addrNode = nl.item( 0 );

            // get the NAME node of this ADDRESS node:
            Node nameNode = getFirstChildElement( (Element) addrNode );
            System.out.println( "\tThe first name is: "
                + nameNode.getFirstChild().getNodeValue() );
         } 

         // Get first Name of first Address Method 2 (normalize document):

         System.out.println( "\nMethod #2: Remove white-space nodes..." );

         normalizeDocument( doc.getDocumentElement() );

         nl = doc.getElementsByTagName( "ADDRESS" );

         count = nl.getLength();
         System.out.println( "\t# of \"ADDRESS\" elements: " + count );

         if ( count > 0 )
         {
            // Get the first ADDRESS node:
            Node addrNode = nl.item( 0 );

            // Get the value of the NAME node of this ADDRESS node:
            Node nameNode = addrNode.getFirstChild();
            System.out.println( "\tThe first name is: "
                + nameNode.getFirstChild().getNodeValue());
         } 

      }
      catch ( Throwable t )
      {
         t.printStackTrace();
      }
   }
}

MyAdddresses.xml

[down arrow] Download MyAddresses.xml
[down arrow] Scroll down to AddrBook.dtd
[up arrow] Scroll up to top

<?xml version="1.0"?>
<!DOCTYPE ADDRESS_BOOK SYSTEM "AddrBook.dtd">
<ADDRESS_BOOK>
  <ADDRESS>
    <NAME>Joe Jones </NAME>
    <STREET>4332 Sunny Hill Road</STREET>
    <CITY>Fairfax</CITY>
    <STATE>VA</STATE>
    <ZIP>21220</ZIP>
  </ADDRESS>
  <ADDRESS>
    <NAME>Sterling Software</NAME>
    <STREET> 7900 Sudley Road</STREET>
    <STREET> Suite 500</STREET>
    <CITY>Manassas</CITY>
    <STATE>VA </STATE>
    <ZIP>20109</ZIP> 
  </ADDRESS>
</ADDRESS_BOOK>

AddrBook.dtd

[down arrow] Download AddrBook.dtd
[up arrow] Scroll up to MyAddresses.xml
[up arrow] Scroll up to top

<!-- Address Book Markup Language Document Type Definition -->
<!ELEMENT ADDRESS_BOOK (ADDRESS)+>
<!ELEMENT ADDRESS (NAME, STREET+, CITY, STATE, ZIP)>
<!ELEMENT NAME (#PCDATA)>
<!ELEMENT STREET (#PCDATA)>
<!ELEMENT CITY (#PCDATA)>
<!ELEMENT STATE (#PCDATA)>
<!ELEMENT ZIP (#PCDATA)>
<!ATTLIST STREET TYPE (street|suiteno|aptno|other) #IMPLIED>