Creating DOM Elements

One area we have not examined closely is how to create and insert objects into a DOM tree. There are two methods for doing this. The first is to build an item from scratch and then insert it. The second it to use the Clone method to clone a given element and then the setNodeValue method to manipulate its contents before inserting it into the tree. The second approach is left as an exercise for the reader. Let's examine how we build an element from scratch.

Adding information to a DOM tree is simple enough if we remember that DOM documents are hierarchical. Looking back to our original catalog example, we remember that a catalog contained "entry" items, each containing a number of subelements. So we can create a new entry as follows:

  1. First, we create the new element that represents our new "entry".

    Element newEntry = document.createElement("entry");
    
  2. Next, we create each of the child items and populate them. For example, the title item

    Element newTitle = document.createElement("title");
    newTitle.appendChild(document.createTextNode("A new book"));
    
  3. Finally, we insert the new child item into its parent.

    newEntry.appendChild(newTitle);
    

In addition to being a child of the entry element, we see that the title item itself has one child item—a TextNode that represents its value.

We would continue for any other children of "entry" elements, such as author, publisher, and price. Price has one other interesting twist to it; it contains attributes. We can create and populate the attributes of the price element one of two ways. We can either create an Attribute object and insert it into the price element, or we can create it directly into the price element. Both methods are shown next.

// We can build attributes either of two ways.
// by building it up from scratch and inserting it.
Attr currAttr= document.createAttribute("cur");
currAttr.setValue("frc"); // this book prices in french francs
newPrice.setAttributeNode(currAttr);

// insert it whole
newPrice.setAttribute("discount","other");
// or by inserting it whole
newEntry.appendChild(newPrice);

The final step is to insert the information back into the DOM tree.

// Now insert it into the document
Element root = document.getDocumentElement();
root.appendChild(newEntry);

Listing 3.9 shows the complete source for adding elements into a DOM tree.

Note

The DOM Core Level I contains no provisions for storing a changed representation of an XML document in memory. If you wish to save the results of an update or change, it is up to you to use either proprietary extensions or your own code!


Code Listing 3.9. CreateElement.java—Adding Elements into a DOM Tree
 1: /*
 2:  * @(#)CreateEntry.java  1.0 99/05/28
 3:  *
 4:  * Copyright (c) 1999 Sams Publishing. All Rights Reserved.
 5:  *
 6:  */
 7: package sams.chp3;
 8:
 9: import java.io.*;
10: import com.sun.xml.tree.*;
11: import org.w3c.dom.*;
12:
13: public class CreateEntry
14: {
15:  public static void main (String argv [])
16:  {
17:   FileInputStream inStream;
18:   Document document;
19:   String xmlDocumentPath = "catalog.xml";
20:   try
21:   {
22:    inStream = new FileInputStream(xmlDocumentPath);
23:    document = XmlDocument.createXmlDocument(inStream,true);
24:
25:    NodeList entries = document.getElementsByTagName( "entry" );
26:     System.out.println("Original catalog contains " + entries.getLength() + " entries");
27:
28:    // Create a new entry element.
29:    Element newEntry = document.createElement("entry");
30:    // Since entry's contain titles we need a title entry
31:    Element newTitle = document.createElement("title");
32:    newTitle.appendChild(document.createTextNode("A new book"));
33:    newEntry.appendChild(newTitle);
34:
35:    // Likewise add the author and publisher items
36:    Element newAuthor = document.createElement("author");
37:    newAuthor.appendChild(document.createTextNode("I.Also Write"));
38:    newEntry.appendChild(newAuthor);
39:    Element newPublisher = document.createElement("publisher");
40:    newPublisher.appendChild(document.createTextNode("We Publishem, Inc."));
41:    newEntry.appendChild(newPublisher);
42:
43://We also need a price which contains two attributes, currency and discount
44:    Element newPrice = document.createElement("price");
45:    newPrice.appendChild(document.createTextNode("5.95"));
46:
47:    // We can build attributes either of two ways.
48:    // by building it up from scratch and inserting it.
49:    Attr currAttr= document.createAttribute("cur");
50:    currAttr.setValue("frc"); // this book prices in french francs
51:    newPrice.setAttributeNode(currAttr);
52:
53:    // insert it whole
54:    newPrice.setAttribute("discount","other");
55:    // or by inserting it whole
56:    newEntry.appendChild(newPrice);
57:
58:    /note that the toString method has no defined behavior for DOM objects
59:    System.out.println("newEntry = " + newEntry.toString());
60:
61:    // Now insert it into the document
62:    Element root = document.getDocumentElement();
63:    root.appendChild(newEntry);
64:
65:    //
66:    //  Now list the entries
67:    //
68:    entries = document.getElementsByTagName( "entry" );
69:    if ( entries.getLength()== 0)
70:    {
71:     System.out.println("No entries in this catalog, exiting");
72:     System.exit(0);
73:    }
74:
75:    for (int i = 0; i < entries.getLength(); i++)
76:    {
77: . . .
78:    }
79:   }
80:   catch (Exception e)
81:   {
82:    System.out.println("Unexpected exception reading document!" +e);
83:    System.exit (0);
84:   }
85:
86:
87:  }
88: }

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.119.111.9