- Defining the Document Object Model
- DOM Core Level I
- Creating Document Objects
- Node Interface
- NodeList and NamedNodeMap
- Document Interface
- Element Interface
- Attr Interface
- Additional Interfaces
- Creating DOM Elements
- DOM Level II
- The DOM Core Defined
- Implementation Anomalies
- Summary
- Suggested for Further Study
- Further Reading
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:
-
First, we create the new element that represents our new "entry".
Element newEntry = document.createElement("entry");
-
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"));
-
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 itema 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!
Listing 3.9 CreateElement.javaAdding 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: }