(XDK)
Bestandteile des XDK
XML Parser
Schema Processor Class Generator
Java Beans XSQL Servlet
XSLT Processor
Java C++ C PL/SQL
PL/SQL XDK: Packages
xmlparser
–
Parser-Funktionen
xmldom
–
enthält DOM-API
xslprocessor
–
enthält XSL-Transformationmöglichkeiten
Verarbeiten von XML
DOM/SAX Parser
XSL Processor
DTD or XML Schema
XSL Stylesheet
Transformiertes Dokument Original
XML Dokument
Parsing-Strategien
DOM-Parser
–
erzeugt einen DOM-Baum im Hauptspeicher
–
DOM-API erlaubt: Transformation, Manipulation und Suche im Baum
–
sehr ressourcenaufwendig
SAX Parser
–
SAX = Simple API for XML
–
produziert einen Output Stream
–
Grundlage: eventgetriebenes Modell
–
sehr gut geeignet für große Dokumente
–
keine W3C-Standard
Parsing-Strategien
<ShoppingCart>
<item>
<Desc>
Fun with XML
<Qty>
1
SAX DOM
<ShoppingCart>
<item>
<Desc> Fun with XML
<Qty> 1
...
DOM-Parser Funktionalität
Create
new parser Parse string
buffer or CLOB
Reset
parser Get document
Free parser (nur PL/SQL)
Use other
DOM functions DOM
Document Properties
XML Input
Beispiel: DOM Parser in PL/SQL
p xmlparser.parser;
doc xmldom.DOMDocument;
begin
p:=xmlparser.newparser;
xmlparser.setValidationMode(p,FALSE);
xmlparser.setErrorLog(p,dir || ‘/‘ ||
errfile);
xmlparser.setBaseDir(p,dir);
xmlparser.parse(p,dir || ‘/‘ || inpfile);
doc:=xmlparser.getDocument(p);
dbms_output.put(‘The elements are: ‘);
printElements(docs);
dbms_output.put(‘The attributes of each element are: ‘);
printElementAttributes(doc);
end;
Create Parser
Get Document Parse XML
Beispiel: DOM Parser in Java (1)
public class DOMSample { ...
DOMParser parser = new DOMParser();
URL url = createURL(argv[0]);
...
public static void main (String[] args){
parser.parse(url);
XMLDocument doc = parser.getDocument();
printElements(doc);
} ...
} Create
Parser
Get Document Parse XML
Aufruf in Kommandozeile (NT oder Unix):
>oraxml options xmlsource
Beispiel: DOM Parser in Java (2)
static void printElements(Document doc) {
NodeList nl = doc.getElementsByTagName(“*“);
Node n;
for (int i=0; i<nl.getLength();i++) { n = nl.item(i);
System.out.print(n.getNodeName() + ““);
}
System.out.println();
} Obtain Tree
Get Information
Nutzung von XPath Expressions
NodeList nl = theXMLDoc.selectNodes(
“//Item[Qty > 0 and Discount > 5]“);
int matches = nl.getLength();
for (int i = 0; i < matches; i++) { System.out.println(
((XMLElement)nl.item(i)).valueOf(“Desc“));
} XPath
Expression
Value of Element
XPath-Referenzen:
http://www.w3.org/TR/xpath.html
http://www.mulberrytech.com/quickref
SAX-Parser Funktionalität
Create
new SAX parser
Parse string buffer or URL
Callback methods
Output stream Properties
XML Input
Validation Mode Base URL
Preserve White Space Document Type
Document Handler DTD Handler
Nutzung des SAX Parsers
public class SAXSample extends HandlerBase ...
Parser parser = new SAXParser();
...
public void characters(char[] cbuf, int start, int len)
{
System.out.print(“Characters:“);
System.out.println(new String(cbuf,start,len));
}
...
} Extend
Base Class
Add Custom Logic
Override Method
gilt für SAX 1.0
XSL Transformation Funktionalität
Create XSL processor
Build stylesheet
Process stylesheet
Output stream Stylesheet
Input
DOM Document Parsed
XML Input
Beispiel XSL Transformation (1)
<html xmlns:xsl=“http://www.w3.org/1999/XSL/Transform“
xsl:version=“1.0“>
<head>
<title>Contents of Shopping Cart</title>
</head>
<body>
<h1>Your Shopping Cart>7H1>
<ul>
<xsl:for-each-select=“/ShoppingCart/Item“>
<li><xsl:value-of-select=“Qty“/>copy of
<strong><xsl:value-of-select=“Desc“/></strong></li>
</xsl:for-each>
</ul>
</body>
</html>
Beispiel für ein XML Stylesheet:
Beispiel XSL Transformation (2)
-- Declarations
xmldoc xmldom.DOMDocument;
proc xslprocessor.Processor;
stst xslprocessor.Stylesheet;
docfrag xmldom.DOMDocumentFragment;
-- parse xml file, build XMLDocument xmldoc...
(...)
-- Transform xmldoc:
stst := xslprocessor.newStylesheet(xsldoc, dir ||
‘/‘|| xslfile);
proc := xslprocessor.newProcessor;
xslprocessor.showWarnings(proc,true);
xslprocessor.setErrorLog(proc, dir || ‘/‘ || errfile);
docfrag := xslprocessor.processXSL(proc,stst,xmldoc);
(...)
Nutzung XSL Processor in PL/SQL:
Beispiel XSL Transformation (3)
...
theParser.parse(XMLStreamToParse);
the XMLDoc = theParser.getDocument();
XSLStylesheet theXSLStylesheet = new XSLStylesheet(XSLStream,null);
XSLProcessor processor = new XSL Processor();
processor.processXSL(theXSLStylesheet,
the XMLDoc,System.out);
Aufruf XSL Processor aus Java-Programm:
Aufruf aus Kommandozeile:
Beispiel XSL Transformation (4)
<html>
<head>
<META http-equiv=“Content-Type“ content=“text/html;
charset=UTF8“>
<title>Contents of Shopping Cart </title>
</head>
<body>
<h1>Your Shopping Cart</h1>
<ul>
<li>1 copy of
<strong>Fun with XML</strong>
</li>
<li>2 copy of
<strong>XML in Literature</strong>
</li>
</ul>
</body>
XML Class Generator
XML Parser for Java
Java Application
Generierte Java-Klassen
Gültiges XML-Document basierend auf DTD oder XML Schema
DTD oder
XML Schema XML Class Generator
for Java
Beispiel: Generierung von Klassen (1)
<!-- DTD for Employee Data -->
<!ELEMENT EMP (EMP_ROW)*>
<!ELEMENT EMP_ROW (EMPNO, ENAME?, JOB?, MGR?, HIREDATE?, SAL?, COMM?, DEPTNO?)>
<!ATTLIST EMP_ROW ROWNO CDATA #REQUIRED>
<!ELEMENT EMPNO (#PCDATA)>
<!ELEMENT ENAME (#PCDATA)>
<!ELEMENT JOB (#PCDATA)>
<!ELEMENT MGR (#PCDATA)>
<!ELEMENT HIREDATE (#PCDATA)>
<!ELEMENT SAL (#PCDATA)>
<!ELEMENT COMM (#PCDATA)>
<!ELEMENT DEPTNO (#PCDATA)>
Die Input-DTD bestimmt die Struktur des XML-Dokuments:
Beispiel: Generierung von Klassen (2)
...
ClassGenerator generator = new ClassGenerator();
generator.setGenerateComments(true);
generator.setOutputDirectory(“.“);
generator.setPackageName(“myPackage“);
generator.generate(dtd, doctype_name);
...
Zur Erzeugung einer neuen Java-Klasse:
Aufruf eines Programms mit XML Wurzel-Element und DTD als Argumenten:
>java SampleMain -root EMP emp.dtd
Verwende ClassGenerator in SampleMain :
Beispiel: Generierung von Klassen (3)
...
EMP EMPLIST = new EMP();
EMP_ROW emp_row1 = new EMP_ROW(“1“);
EMPNO empno1 = new EMPNO(“7654“);
ENAME ename1 = new ENAME(“MARTIN“);
Emp_row1.addNode(empno1);
...
Applikationen können
erzeugte Klassen benutzen ...
...
<EMP>
<EMP_ROW ROWNO=“1“>
<EMPNO>7654</EMPNO>
<ENAME>MARTIN</ENAME>
<EMP_ROW>
...
... und XML-Output produzieren
<%! cursor prod_cur is select * from products
where price between minprice and´maxprice vc_name varchar2(200):=‘Peter‘; %>
<%! cursor prod_cur is select * from products
where price between minprice and´maxprice vc_name varchar2(200):=‘Peter‘; %>
SQL>CREATE OR REPLACE PACKAGE comm_package IS
2 g_comm NUMBER := 10; --initialized to 10 3 PROCEDURE reset_comm
4 (v_comm IN NUMBER);
5 END comm_package;
6 /