Download Powerpoint

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Java and XML
Modified from presentation by:
Barry Burd
Drew University
[email protected]
Portions © 2002 Hungry Minds, Inc.
1
Outline
• Review of XML
• Discussion of some Java XML APIs
including
– SAX
– DOM
2
Review of XML
<?xml version="1.0" encoding="UTF-8"?>
<Greeting type="friendly">
Hello
</Greeting>
Characters
(text)
End tag
Processing
instruction
Start tag
3
Review of XML
<?xml version="1.0" encod
<Greeting type="friendly">
Hello
</Greeting>
Element
Attribute
value
Attribute
name
4
Review of XML
<song tempo="&Moderato;">
<measure>
<beat>
<note pitch="&G;"/>
<note pitch="&C;"/>
<note pitch="&C;"/>
</beat>
...
Entity
references
Empty
Elements
5
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.
6
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
7
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)>
8
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)>
9
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
10
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
11
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
12
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());
Calling
SAX
//...(more)
13
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
Calling
SAX
xmlReader.parse (new
File(“weather.xml").
toURL().toString());
}
}
14
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...
15
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));
}
}
16
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);
}
17
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.");
}
}
18
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>
19
Starting the document.
Start tag: WeatherReport
1 characters: $
Start tag: City
12 characters: White Plains
End tag: City
1 characters: $
Start tag: State
2 characters: NY
End tag: State
1 characters: $
Start tag: Date
15 characters: Sat Jul 25 1998
End tag: Date
1 characters: $
Start tag: Time
9 characters: 11 am EDT
End tag: Time
1 characters: $
Start tag: CurrTemp
Attribute: unit = Farenheit
2 characters: 70
End tag: CurrTemp
1 characters: $
Start tag: High
Attribute: unit = Farenheit
2 characters: 82
End tag: High
1 characters: $
Start tag: Low
Attribute: unit = Farenheit
2 characters: 62
End tag: Low
1 characters: $
End tag: WeatherReport
Ending the document.
The
Output
20
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
21
import
import
import
import
javax.xml.parsers.*;
org.xml.sax.SAXException;
java.io.*;
org.w3c.dom.Document;
Calling
DOM
public class CallDOM
{
public static void main(String args[])
throws ParserConfigurationException,
SAXException,
IOException
{
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder =
factory.newDocumentBuilder();
Document doc;
// More...
}
}
22
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
Calling
DOM
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");
}
}
23
class MyTreeTraverser
{
String indent="";
MyTreeTraverser (Node node)
{
traverse(node);
}
A
Tree Traverser
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();
}
}
24
Name: #document
Value: 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
The
Output
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:
25
Setting an Error Handler
• In SAX:
xmlReader.setErrorHandler new MyErrorHandler());
• In DOM
builder.setErrorHandler (new MyErrorHandler());
26
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();
}
An Error
Handler
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());
}
}
27
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)
28
Turning on DTD Validation
// must do this before using the factory
factory.setValidating(true);
29
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: #document
Value: null
Name: WeatherReport
Value: null
Name: WeatherReport
Value: null
…
30
<?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>
31
Using
XSL
<?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>
An XSL
Stylesheet
<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>
32
<xsl:template match="Chapter">
<b>&#160;&#160;&#160;&#160;<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;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#8226;
<xsl:value-of select="."/><br/>
</xsl:template>
<xsl:template match="Appendix">
<b>&#160;&#160;&#160;&#160;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)
33
JavaAndXMLforDummies.htm
<h2>Java and XML For Dummies</h2>
<b>&nbsp;&nbsp;&nbsp;&nbsp;Introduction</b>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&bull; About This Book<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&bull; Conventions Used in This
Book<br>
<h2>Part I: The Big Picture</h2>
<b>&nbsp;&nbsp;&nbsp;&nbsp;Chapter 1:
SAX</b>
... Etc.
34
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
35
Applying XSL with Java Code
import 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...
36
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")));
}
}
37
The Usual Scenario...
http GET request
for
JavaAndXMLforDummies.jsp
HTTP server
Client
Browser
response
.htm file
Servlet container
.jsp file
.xml file
.xsl file
38
Related documents