Upload
owen-tucker
View
221
Download
1
Embed Size (px)
Citation preview
1
Dr Alexiei Dingli
XML Technologies
SAX and DOM
2
• Simple API for XML
• Used to parse XML
• But does not create a default object
• It just fires events when it detects objects such as– open or close tags– PCDATA or CDATA– Comments– entities
What is SAX?
3
• Imagine the following document:
<?xml version = "1.0"?>
<addressbook>
<person>
<lastname>Dingli</lastname>
<firstname>Alexiei</firstname>
<company>University of Malta</company>
<email>[email protected]</email>
</person>
</addressbook>
Example
4
1. Creating a custom object model (like Person and AddressBook classes)
2. Creating a SAX parser
3. Creating a DocumentHandler (to turn your XML document into instances of your custom object model).
SAX in 3 steps
5
• Create both a person and an address book object
• Create its setters, getters and to xml methods
Custom Object Model (1)
6
Custom Object Model
(2)
7
Create a SAX
parser
8
• Actually 4 Interfaces ...
– The Document Handler
– The Entity Resolver
– The DTD Handler
– The Error Handler
Create a Document Handler (1)
9
Create a Document Handler (2)
10
parser.setDocumentHandler( ... )
parser.setDTDHandler( ... )
parser.setErrorHandler( ... )
Setting the parser
11
• Rather than implementing all the interfaces mentioned earlier
• Make use of org.xml.sax.helpers.DefaultHandler
• Which implements all the methods
• And you simply override what you want to use
• http://java.sun.com/j2se/1.4.2/docs/api/org/xml/sax/helpers/DefaultHandler.html
Handler Class
12
SAX Handler
Example Handler
13
• W3C standard
• Standard way of accessing and manipulating documents
• Divided into 3 parts
– Core DOM (access any structured document)
– XML DOM
– HTML DOM
• Presents element as a tree structure
DOM
14
• A standard object model for XML
• A standard programming interface for XML
• Platform- and language-independent
• A W3C standard
• The XML DOM is a standard for how to get, change, add, or delete XML elements
XML DOM
15
Everything in XML is a node
– The entire document is a document node– Every XML element is an element node– The text in the XML elements are text nodes– Every attribute is an attribute node– Comments are comment nodes
XML DOM rulez
16
<bookstore>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<year>2008</year>
</book>
</bookstore>
• Bookstore is the root node
• It contains one book node
• A book node contains a title node and a year node
• Title contains a text node “Learning XML”
• 2008 is not the value of the year node but a text node inside the year node
Example
17
• Any DOM object has a node tree where– In a node tree, the top node is called the root– Every node, except the root, has exactly one
parent node– A node can have any number of children– A leaf is a node with no children– Siblings are nodes with the same parent
The node tree
18
text="<bookstore>"
text=text+"<book>";
text=text+"<title>Everyday Italian</title>";
text=text+"<author>John Smith</author>";
text=text+"<year>2008</year>";
text=text+"</book>";
text=text+"</bookstore>";
Creating the XML
19
try //Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false";
xmlDoc.loadXML(text);
} catch(e) {
try //Firefox, Mozilla, Opera, etc.
{
parser=new DOMParser(); xmlDoc=parser.parseFromString(text,"text/xml");
} catch(e) {
alert(e.message)
}
}
document.write("xmlDoc is loaded, ready for use");
Parsing the XML
20
• x.getElementsByTagName(name) - get all elements with a specified tag name
• x.appendChild(node) - insert a child node to x
• x.removeChild(node) - remove a child node from x
XML DOM Methods
21
• x.nodeName - the name of x
• x.nodeValue - the value of x
• x.parentNode - the parent node of x
• x.childNodes - the child nodes of x
• x.attributes - the attributes nodes of x
XML DOM properties
22
document.write(xmlDoc.getElementsByTagName("title") [0].childNodes[0].nodeValue);
document.write("<br />");
document.write(xmlDoc.getElementsByTagName("author") [0].childNodes[0].nodeValue);
document.write("<br />");
document.write(xmlDoc.getElementsByTagName("year") [0].childNodes[0].nodeValue);
Examples
23
1. By using the getElementsByTagName() method
2. By looping through (traversing) the nodes tree
3. By navigating the node tree, using the node relationships
Accessing nodes
24
xmlDoc.getElementsByTagName("title") [0].childNodes[0].nodeValue;
Example 1
25
x=xmlDoc.getElementsByTagName("title");
for ( i=0; i<x.length; i++) { document.write(x[i].childNodes[0].nodeValue); document.write("<br />");
}
Example 2
26
x=xmlDoc.getElementsByTagName("book")[0].childNodes;
y=xmlDoc.getElementsByTagName("book")[0].firstChild;
for (i=0;i<x.length;i++) {
if (y.nodeType==1) {//Process only element_nodes (type 1)
document.write(y.nodeName + "<br />");
}
y=y.nextSibling;
}
Example 3
27
• nodeName
• nodeValue
• nodeType
Node properties
28
• nodeName is read-only
• nodeName of an element node is the same as the tag name
• nodeName of an attribute node is the attribute name
• nodeName of a text node is always #text
• nodeName of the document node is always #document
nodeName property
29
• nodeValue for element nodes is undefined
• nodeValue for text nodes is the text itself
• nodeValue for attribute nodes is the attribute value
nodeValue property
30
Node type NodeType
Element 1
Attribute 2
Text 3
Comment 8
Document 9
nodeType property
31
x=xmlDoc.getElementsByTagName("book")[0].attributes;
document.write(x.getNamedItem("category").nodeValue);
Acessing node attributes
32
// documentElement always represents the root node
x=xmlDoc.documentElement.childNodes;
for (i=0;i<x.length;i++) {
document.write(x[i].nodeName); document.write(": "); document.write(x[i].childNodes[0].nodeValue); document.write("<br />");
}
Traversing Example
33
• parentNode
• childNodes
• firstChild
• lastChild
• nextSibling
• previousSibling
Navigating Nodes (1)
34
Navigating Nodes (2)
35
x=xmlDoc.getElementsByTagName("title")[0];
y=x.childNodes[0];
txt=y.nodeValue;
Result = the name of the book
Title node > Text node
Getting the node value
36
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
x.nodeValue="Easy Cooking";
Setting the node value
37
y=xmlDoc.getElementsByTagName("book")[0];
xmlDoc.documentElement.removeChild(y);
Or
y.parentNode.removeChild(y);
Removing Nodes
38
newel=xmlDoc.createElement("edition");
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newel);
Creating nodes
39
newel=xmlDoc.createElement("edition");
newtext=xmlDoc.createTextNode("first");
newel.appendChild(newtext);
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newel);
Creating text nodes
40
newCDATA=xmlDoc.createCDATASection("Special Offer & Book Sale");
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newCDATA);
Create CDATA nodes
41
newComment=xmlDoc.createComment("Revised March 2008");
x=xmlDoc.getElementsByTagName("book")[0];
x.appendChild(newComment);
Create Comment Node
42
x.appendChild(newNode)
x.insertBefore(newNode,y)
x.cloneNode(true) // add all attributes and children if true
x.insertData(offset,"Easy "); // add text
More additional methods
43
x=xmlDoc.getElementsByTagName("title")[0].getAttributeNode("lang");
txt=x.nodeValue;
Getting attribute value
44
newatt=xmlDoc.createAttribute("edition");
newatt.nodeValue="first";
x=xmlDoc.getElementsByTagName("title");
x[0].setAttributeNode(newatt);
Creating attributes
45
x=xmlDoc.getElementsByTagName('book');
x[0].setAttribute("category","food");
Or
x=xmlDoc.getElementsByTagName("book")[0]
y=x.getAttributeNode("category");
y.nodeValue="food";
Setting the attribute value
46
x=xmlDoc.getElementsByTagName("book");
x[0].removeAttribute("category");
Removing attributes
47
• Given the following XML file
• How shall we display – Two buttons
• “Get CD info” and display the Titles and the Composer
• “Get CD info abridged” and display the Titles only
Exercise
48
• The code
• What’s the result?
Answer (1)
49
Answer (2)
50
Questions?