1 java and xml modified from presentation by: barry burd drew university me@barryburd.com portions...
Post on 12-Jan-2016
212 Views
Preview:
TRANSCRIPT
1
Java and XML
Modified from presentation by:Barry Burd
Drew Universityme@BarryBurd.com
Portions © 2002 Hungry Minds, Inc.
2
Outline
• Review of XML
• Discussion of some Java XML APIs including– SAX– DOM
3
Review of XML
<?xml version="1.0" encoding="UTF-8"?><Greeting type="friendly"> Hello</Greeting>
Start tagEnd tag
Processing instructionCharacters
(text)
4
Review of XML
<?xml version="1.0" encod<Greeting type="friendly"> Hello</Greeting>
Element
Attribute name
Attribute value
5
Review of XML
<song tempo="&Moderato;"> <measure> <beat> <note pitch="&G;"/> <note pitch="&C;"/> <note pitch="&C;"/> </beat> ...
Empty Elements
Entity references
6
Document Type Definition (DTD)
<?xml version="1.0" encoding="UTF-8"?><!-- Song.dtd -->
<!ELEMENT song (measure*)> <!ATTLIST song tempo CDATA "&Moderato;"><!ELEMENT measure (beat*)><!ELEMENT beat (note*)><!ATTLIST note pitch CDATA #REQUIRED><!ENTITY C "60">...Etc.
7
A Doc that’s not well-formed
<Greeting> Hello world! <Question> How are you? <Question> <!-- Oh, no! This start tag should be an end tag! --> </Greeting>
Comment
8
An Invalid Document<!DOCTYPE Greeting SYSTEM "InvalidDoc.dtd"><Greeting> Hello world! <Question> <!-- No Question element in the DTD --> How are you? </Question> </Greeting>
<?xml version="1.0" encoding="UTF-8"?> <!-- InvalidDoc.dtd --><!ELEMENT Greeting (#PCDATA)>
9
A valid document
<!DOCTYPE Greeting SYSTEM "Greeting.dtd"><Greeting> Hello world! <Question> How are you? </Question></Greeting>
<!-- Greeting.dtd --> <!ELEMENT Greeting (#PCDATA | Question)*><!ELEMENT Question (#PCDATA)>
10
Outline
• Review of XML
• Discussion of some Java XML APIs– What APIs are available– SAX– DOM– Validation, namespaces, etc.– Creating a new XML document using DOM– Using XSL
11
Some of the Java APIs
• JAXP (Java API for XML Processing)– SAX (Simple API for XML)– DOM (Document Object Model)
– JAXP comes standard with J2SE 1.4
– It is installed on cerebro if you use the path /usr/local/linux-jdk1.3.1/bin
12
SAX
• Event driven
• Deals with start tags, end tags, etc.
• No inherent notion of an element
• No inherent notion of nesting
• No in-memory copy of the whole document
13
import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;class CallSAX{ static public void main(String[] args) throws SAXException, ParserConfigurationException, IOException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.setContentHandler (new MyContentHandler());
//...(more)
Calling SAX
14
import javax.xml.parsers.*;import org.xml.sax.*;import java.io.*;class CallSAX{ static public void main(String[] args) throws SAXException, ParserConfigurationException, IOException { //...Stuff from previous slide
xmlReader.parse (new File(“weather.xml"). toURL().toString()); }}
Calling SAX
15
A Content Handler
import org.xml.sax.helpers.DefaultHandler;import org.xml.sax.Attributes;
class MyContentHandler extends DefaultHandler{ public void startDocument() { System.out.println ("Starting the document."); }
// More...
16
A Content Handler (cont’d) public void startElement(String uri, String localName, String qualName, Attributes attribs) { System.out.print("Start tag: "); System.out.println(qualName); for (int i=0; i<attribs.getLength(); i++) { System.out.print("Attribute: "); System.out.print(attribs.getQName(i)); System.out.print(" = "); System.out.println(attribs.getValue(i)); } }
17
A Content Handler (cont’d) public void characters (char[] charArray, int start, int length) { String charString = new String(charArray, start, length);
charString = charString.replaceAll("\n", "[cr]"); charString = charString.replaceAll(" ", "[blank]");
System.out.print(length + " characters: "); System.out.println(charString); }
18
A Content Handler (cont’d) public void endElement(String uri, String localName, String qualName) { System.out.print("End tag: "); System.out.println(qualName); }
public void endDocument() { System.out.println("Ending the document."); }}
19
A Sample Document
<?xml version="1.0"?><WeatherReport><City>White Plains</City><State>NY</State><Date>Sat Jul 25 1998</Date><Time>11 am EDT</Time><CurrTemp Unit="Farenheit">70</CurrTemp>
<High Unit="Farenheit">82</High><Low Unit="Farenheit">62</Low></WeatherReport>
20
The Output
Starting the document.Start tag: WeatherReport1 characters: $Start tag: City12 characters: White PlainsEnd tag: City1 characters: $Start tag: State2 characters: NYEnd tag: State1 characters: $Start tag: Date15 characters: Sat Jul 25 1998End tag: Date1 characters: $Start tag: Time9 characters: 11 am EDTEnd tag: Time1 characters: $Start tag: CurrTempAttribute: unit = Farenheit2 characters: 70End tag: CurrTemp1 characters: $Start tag: HighAttribute: unit = Farenheit2 characters: 82End tag: High1 characters: $Start tag: LowAttribute: unit = Farenheit2 characters: 62End tag: Low1 characters: $End tag: WeatherReportEnding the document.
21
DOM
• Not event driven• Creates an in-memory copy of the
document• Deals with document nodes• Nodes are nested• Elements are nodes, but so are attributes,
text, processing instructions, comments, the entire document itself
• No inherent notion of a tag
22
Calling DOM
import javax.xml.parsers.*;import org.xml.sax.SAXException;import java.io.*;import org.w3c.dom.Document;
public class CallDOM{ public static void main(String args[]) throws ParserConfigurationException, SAXException, IOException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc;
// More... }}
23
Calling DOM
import javax.xml.parsers.*;import org.xml.sax.SAXException;import java.io.*;import org.w3c.dom.Document;public class CallDOM{ public static void main(String args[]) throws ParserConfigurationException, SAXException, IOException { //... Stuff from previous slide
if (args.length == 1) { doc = builder.parse (new File(args[0]).toURL().toString()); new MyTreeTraverser (doc); } else System.out.println ("Usage: java CallDOM file-name.xml"); }}
24
class MyTreeTraverser{ String indent="";
MyTreeTraverser (Node node) { traverse(node); } void traverse(Node node){ displayName(node); displayValue(node); if (node.getNodeType() == Node.ELEMENT_NODE) displayAttributes(node);
indent=indent.concat(" "); displayChildren(node); indent=indent.substring(0,indent.length()-3); } // …stuff void displayChildren(Node node) { Node child = node.getFirstChild(); while (child != null) { traverse(child); child = child.getNextSibling(); } }
A Tree Traverser
25
The Output
Name: #documentValue: null Name: WeatherReport Value: null Name: #text Value: Name: City Value: null Name: #text Value: White Plains Name: #text Value: Name: State Value: null Name: #text Value: NY Name: #text Value: Name: Date Value: null Name: #text Value: Sat Jul 25 1998 Name: #text Value:
Name: Time Value: null Name: #text Value: 11 am EDT Name: #text Value: Name: CurrTemp Value: null
Attribute: Unit = Farenheit Name: #text Value: 70 Name: #text Value: Name: High Value: null
Attribute: Unit = Farenheit Name: #text Value: 82 Name: #text Value: Name: Low Value: null
Attribute: Unit = Farenheit Name: #text Value: 62 Name: #text Value:
26
Setting an Error Handler
• In SAX: xmlReader.setErrorHandler new MyErrorHandler());
• In DOMbuilder.setErrorHandler (new MyErrorHandler());
27
An Error Handler
import org.xml.sax.helpers.DefaultHandler;import org.xml.sax.SAXParseException;class MyErrorHandler extends DefaultHandler{ public void error(SAXParseException e) { System.out.println("Error:"); showSpecifics(e); System.out.println(); } public void showSpecifics(SAXParseException e) { System.out.println(e.getMessage()); System.out.println (" Line " + e.getLineNumber()); System.out.println (" Column " + e.getColumnNumber()); System.out.println (" Document " + e.getSystemId()); }}
28
import org.xml.sax.helpers.DefaultHandler;import org.xml.sax.SAXParseException;class MyErrorHandler extends DefaultHandler{ public void warning(SAXParseException e) { System.out.println("Warning:"); showSpecifics(e); System.out.println(); } public void fatalError(SAXParseException e) { System.out.println("Fatal error:"); showSpecifics(e); System.out.println(); }
// ...}
An Error Handler (cont’d)
29
Turning on DTD Validation
// must do this before using the factory
factory.setValidating(true);
30
The Output
Error:Attribute value for "Unit" is #REQUIRED. Line 9 Column -1 Document file:/usr/local/www/data/csci380/02s/examples/xml/DOMvalid/weather2.xml
Name: #documentValue: null Name: WeatherReport Value: null Name: WeatherReport Value: null…
31
<?xml-stylesheet type="text/xsl" href="JavaAndXMLforDummies.xsl"?><Book title="Java and XML For Dummies"> <Chapter title="Introduction"> <Section>About This Book</Section> <Section>Conventions Used in This Book</Section> </Chapter> <Part number="I" title="The Big Picture"> <Chapter number="1" title="SAX"> <Section>A "Hello" Example</Section> <Section>Doing Validation</Section> </Chapter> <Chapter number="2" title="DOM"> <Section>A "Hello" Example</Section> <Section>Creating a new document</Section> </Chapter> </Part> <Part title="Appendixes"> <Appendix number="A" title="Things to Remember about Java"> </Appendix> <Appendix number="B" title="Things to Remember about XML"> </Appendix> </Part></Book>
Using XSL
32
<?xml version="1.0"?><xsl:stylesheet xmlns:xsl= http://www.w3.org/1999/XSL/Transform version="1.0"> <xsl:output method="html"/>
<xsl:template match="Book"> <h2><xsl:value-of select="@title"/></h2> <xsl:apply-templates /> </xsl:template> <xsl:template match="Part"> <h2> <xsl:if test="@number">Part <xsl:value-of select="@number"/>: </xsl:if><xsl:value-of select="@title"/> </h2> <xsl:apply-templates /> </xsl:template>
An XSL Stylesheet
33
<xsl:template match="Chapter"> <b>    <xsl:if test="@number">Chapter <xsl:value-of select="@number"/>: </xsl:if><xsl:value-of select="@title"/></b><br/> <xsl:apply-templates /> </xsl:template> <xsl:template match="Section"> #160;       •
<xsl:value-of select="."/><br/> </xsl:template> <xsl:template match="Appendix"> <b>    Appendix <xsl:value-of select="@number"/>: <xsl:value-of select="@title"/></b><br/> <xsl:apply-templates /> </xsl:template>
</xsl:stylesheet>
An XSL Stylesheet
(cont’d)
34
JavaAndXMLforDummies.htm<h2>Java and XML For Dummies</h2> <b> Introduction</b><br> • About This Book<br>
• Conventions Used in This Book<br>
<h2>Part I: The Big Picture</h2> <b> Chapter 1: SAX</b>
... Etc.
35
Java and XML For Dummies Introduction
• About This Book • Conventions Used in This Book
Part I: The Big Picture Chapter 1: SAX
• A "Hello" Example • Doing Validation Chapter 2: DOM • A "Hello" Example • Creating a new document
Appendixes Appendix A: Things to Remember about Java
Appendix B: Things to Remember about XML
36
Applying XSL with Java Codeimport javax.xml.transform.TransformerFactory;import javax.xml.transform.Transformer;import javax.xml.transform.stream.StreamSource;import javax.xml.transform.stream.StreamResult;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerConfigurationException;import java.io.FileOutputStream;import java.io.FileNotFoundException;import java.io.IOException;
More...
37
Applying XSL with Java Code (cont’d)
public class MyTransform{ public static void main(String[] args) throws TransformerException, TransformerConfigurationException, FileNotFoundException, IOException {
TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer (new StreamSource("JavaAndXMLforDummies.xsl")); transformer.transform (new StreamSource("JavaAndXMLforDummies.xml"), new StreamResult (new FileOutputStream("JavaAndXMLforDummies.htm"))); }}
38
The Usual Scenario...
Client Browser
http GET requestfor
JavaAndXMLforDummies.jsp
HTTP server
Servlet container
.xml file.xml file .xsl file.xsl file
.jsp file.jsp file
.htm file.htm file
response
top related