JAXP, Anwendung

Lager mit DOM und SAX
JAXP, Lagerverwaltung
Lager UML Diagramm
Lagerverwaltung, UML Klassen-Diagramm

DTDs

lager.dtd:

<?xml version="1.0" encoding="iso-8859-1" ?> 

<!ELEMENT lager (artikel*) >

<!ELEMENT artikel (bezeichnung,bestand,preis) >
<!ATTLIST artikel nr ID #REQUIRED >

<!ELEMENT bezeichnung (#PCDATA) >
<!ATTLIST bezeichnung gruppe NMTOKEN #IMPLIED >

<!ELEMENT bestand (#PCDATA) >
<!ATTLIST bestand min CDATA #IMPLIED >
<!ATTLIST bestand soll CDATA #IMPLIED >
<!ATTLIST bestand max CDATA #IMPLIED >

<!ELEMENT preis (#PCDATA) >
<!ATTLIST preis einheit (EUR|USD) #REQUIRED >

ein Lager: lager.xml

<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE lager SYSTEM "lager.dtd" >
<lager>

<artikel nr="a.1">
<bezeichnung gruppe="Bilderrahmen">Glas 40x50</bezeichnung>
<bestand max="10" min="0" soll="3">5</bestand>
<preis einheit="EUR">50.00</preis>
</artikel>

<artikel nr="a.2">
<bezeichnung gruppe="Bilderrahmen">Glas 60x70</bezeichnung>
<bestand max="20" min="2" soll="5">2</bestand>
<preis einheit="EUR">60.00</preis>
</artikel>

<artikel nr="a.3">
<bezeichnung gruppe="Bilderrahmen">Glas ohne Rahmen 30x40</bezeichnung>
<bestand max="20" min="5" soll="10">12</bestand>
<preis einheit="EUR">40.00</preis>
</artikel>

<artikel nr="a.4">
<bezeichnung gruppe="Bilderrahmen">Glas 20x30</bezeichnung>
<bestand max="20" min="5" soll="10">8</bestand>
<preis einheit="EUR">30.00</preis>
</artikel>

</lager>

bestellung.dtd:

<?xml version="1.0" encoding="iso-8859-1" ?> 

<!ELEMENT bestellung (adresse,artikel*) >

<!ELEMENT artikel (anzahl) >
<!ATTLIST artikel nr ID #REQUIRED >

<!ELEMENT anzahl (#PCDATA) >

<!ELEMENT adresse (#PCDATA) >

eine Bestellung: bestellung.xml

<?xml version="1.0" encoding="iso-8859-1" ?>

<!DOCTYPE bestellung SYSTEM "bestellung.dtd">

<bestellung>

<adresse>
Uni, B 6, 68131 Mannheim
</adresse>

<artikel nr="a.3" >
<anzahl>1</anzahl>
</artikel>

<artikel nr="a.1" >
<anzahl>40</anzahl>
</artikel>

</bestellung>

lieferung.dtd:

<?xml version="1.0" encoding="iso-8859-1" ?> 

<!ELEMENT lieferung (adresse,artikel*) >

<!ELEMENT adresse (#PCDATA) >

<!ELEMENT artikel (bezeichnung,anzahl) >
<!ATTLIST artikel nr ID #REQUIRED >

<!ELEMENT bezeichnung (#PCDATA) >
<!ATTLIST bezeichnung gruppe NMTOKEN #IMPLIED >

<!ELEMENT anzahl (#PCDATA) >

eine Lieferung: lieferung.xml

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE lieferung SYSTEM "lieferung.dtd" >
<lieferung>

<adresse>
Uni, B 6, 68131 Mannheim
</adresse>

<artikel nr="a.3">
<bezeichnung>Bilderrahmen, Glas ohne Rahmen 30x40</bezeichnung>
<anzahl>1</anzahl>
</artikel>

<artikel nr="a.1">
<bezeichnung>Bilderrahmen, Glas 40x50</bezeichnung>
<anzahl>5</anzahl>
</artikel>

</lieferung>

rechnung.dtd:

<?xml version="1.0" encoding="iso-8859-1" ?> 

<!ELEMENT rechnung (adresse,artikel*,summe) >

<!ELEMENT adresse (#PCDATA) >

<!ELEMENT artikel (bezeichnung,anzahl,epreis,gpreis) >
<!ATTLIST artikel nr ID #REQUIRED >

<!ELEMENT bezeichnung (#PCDATA) >
<!ATTLIST bezeichnung gruppe NMTOKEN #IMPLIED >

<!ELEMENT anzahl (#PCDATA) >

<!ELEMENT epreis (#PCDATA) >
<!ATTLIST epreis einheit (EUR|USD) #IMPLIED >

<!ELEMENT gpreis (#PCDATA) >
<!ATTLIST gpreis einheit (EUR|USD) #IMPLIED >

<!ELEMENT summe (#PCDATA) >
<!ATTLIST summe einheit (EUR|USD) #IMPLIED >

eine Rechnung: rechnung.xml:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE rechnung SYSTEM "rechnung.dtd" >
<rechnung>

<adresse>
Uni, B 6, 68131 Mannheim
</adresse>

<artikel nr="a.3">
<bezeichnung>Bilderrahmen, Glas ohne Rahmen 30x40</bezeichnung>
<anzahl>1</anzahl>
<epreis einheit="EUR">40.00</epreis>
<gpreis einheit="EUR">40.0</gpreis>
</artikel>

<artikel nr="a.1">
<bezeichnung>Bilderrahmen, Glas 40x50</bezeichnung>
<anzahl>5</anzahl>
<epreis einheit="EUR">50.00</epreis>
<gpreis einheit="EUR">250.0</gpreis>
</artikel>

<summe einheit="EUR">290.0</summe>
</rechnung>

Lager als DOM Objekt

DOMLager Klasse:

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.Element; 
import org.w3c.dom.Text; 
import org.w3c.dom.DocumentType; 
import java.io.IOException;
import org.xml.sax.SAXException;
import java.util.Hashtable;

public class DOMLager {

    Document lagerDoc = null;
    Element lager = null;
    Hashtable artikel = null;


    public DOMLager(Document d) 


    // Wert des gesammten Lagers
    public String getWert() 


    // liefert Preis für einen Artikel
    public double getPreisArtikel(Element art, String einheit) 


    // liefert Lagerbestand eines Artikels über Artikel-Element
    public long getBestandArtikel(Element art) 


    // liefert Lagerbestand eines Artikels über Artikelnummer
    public long getBestandNummer(String nr) 


    // liefert Bezeichnung eines Artikels über Artikelnummer
    public String getBezeichnungNummer(String nr) 


    // ändert Lagerbestand eines Artikels über Artikelnummer
    public void setBestandNummer(String nr, long b) 


    // liefert Warengruppe eines Artikels über Artikelnummer
    public String getBezeichnungGruppeNummer(String nr) 


    // liefert Preis eines Artikels über Artikelnummer
    public String getPreisNummer(String nr) 


    // liefert Währungseinheit des Preises eines Artikels über Artikelnummer
    public String getPreisEinheitNummer(String nr) 
}

DOMLager.java

Anwendung: Ermittlung des Werts des Lagers mit der Klasse LagerWert

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document; 
import java.io.IOException;
import org.xml.sax.SAXException;

public class LagerWert {

    public static void main(String[] args) {

	Screen sc = new Screen();
	if (args.length < 1) {
	    sc.println("Usage: LagerWert <lagerdatei.xml>");
            return;
	}

	DocumentBuilderFactory pfac = DocumentBuilderFactory.newInstance();
	DocumentBuilder parser = null;
	try {
	   pfac.setValidating(true);
	   parser = pfac.newDocumentBuilder();
	}
	catch (ParserConfigurationException e) {
	    e.printStackTrace();
	}

	Document doc = null;
        String uri = args[0];
	try {
            doc = parser.parse(uri);
	}
	catch (SAXException e) {
	    e.printStackTrace();
	}
	catch (IOException e) {
	    e.printStackTrace();
	}

        DOMLager lager = new DOMLager(doc);
        sc.println( lager.getWert() );
	sc.println();
    }
}

Ergebnis:

/usr/lib/jdk1.3/bin/java -classpath /opt/java_xml_pack-winter-01-dev/jaxp-1.2-ea1/xerces.jar:. LagerWert lager.xml

<wert >
<preis einheit="EUR">1090.0</preis>
</wert>

Bestellung zu Lieferschein mit SAX

SAXBestellung Klasse:

import java.io.IOException;
import java.io.PrintWriter;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.AttributesImpl;
import org.w3c.dom.Document; 

public class SAXBestellung extends SAXSchreiber {

    DOMLager lager = null;


    public SAXBestellung(PrintWriter p, DOMLager d) 


    boolean getAnzahl = false;
    String aNummer = "";


    // print DOCTYPE
    public void startDocument() 


    // Bearbeitung von bestellung, artikel und anzahl
    public void startElement(String nameuri, String local, String quali, 
                             Attributes attrs) 
    // Einlesen von aNummer, Erzeugen von bezeichnung


    // Bearbeitung von bestellung
    public void endElement(String nameuri, String local, String quali) 


    // Bearbeitung von anzahl falls getAnzahl
    public void characters(char ch[], int start, int length) 
    // update von DOMLager
}

SAXBestellung.java, SAXSchreiber.java

Anwendung: lesen einer Bestellung, erzeugen des Lieferscheins und update des Lagers

Usage: Bestellung <lagerdatei.xml> <bestellung.xml> <lieferung.xml>
public class Bestellung {

    public static void main(String[] args) {

	// Lager einlesen: 
	Document lager = null;
        String lauri = args[0];
            lager = lparser.parse(lauri);


	// Bestellung einlesen und Lieferschein schreiben: 
        String buri = args[1];
        String liuri = args[2];
        DateiAus lid = null;
            lid = new DateiAus(liuri);
	DOMLager domLager = new DOMLager(lager); 
	DefaultHandler dh = new SAXBestellung(lid,domLager);
            bparser.parse(buri,dh);


	// Lager sichern
	DateiAus lad = null;
	    lad = new DateiAus(lauri+".new");
        DOMSchreiber ls = new DOMSchreiber(lad);
        ls.printNode(lager);
        ls.close();
    }
}

Bestellung.java, DOMSchreiber.java

Das Ergebnis ist lieferung.xml von weiter oben und die folgende neue lager.xml.

lager.xml:

<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE lager SYSTEM "lager.dtd" >
<lager>

<artikel nr="a.1">
<bezeichnung gruppe="Bilderrahmen">Glas 40x50</bezeichnung>
<bestand max="10" min="0" soll="3">0</bestand>
<preis einheit="EUR">50.00</preis>
</artikel>

<artikel nr="a.2">
<bezeichnung gruppe="Bilderrahmen">Glas 60x70</bezeichnung>
<bestand max="20" min="2" soll="5">2</bestand>
<preis einheit="EUR">60.00</preis>
</artikel>

<artikel nr="a.3">
<bezeichnung gruppe="Bilderrahmen">Glas ohne Rahmen 30x40</bezeichnung>
<bestand max="20" min="5" soll="10">11</bestand>
<preis einheit="EUR">40.00</preis>
</artikel>

<artikel nr="a.4">
<bezeichnung gruppe="Bilderrahmen">Glas 20x30</bezeichnung>
<bestand max="20" min="5" soll="10">8</bestand>
<preis einheit="EUR">30.00</preis>
</artikel>

</lager>

Lieferschein zu Rechnung mit SAX

SAXRechnung Klasse:

import java.io.IOException;
import java.io.PrintWriter;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.AttributesImpl;
import org.w3c.dom.Document; 

public class SAXRechnung extends SAXSchreiber {

    DOMLager lager = null;


    public SAXRechnung(PrintWriter p, DOMLager d) 


    boolean getAnzahl = false;
    long anzahl = 0;
    String aNummer = "";
    String einheit = "EUR";
    double summe = 0.0;
    AttributesImpl einheitAttribut = null;


    // print DOCTYPE, Initialisierung einheitAttribut
    public void startDocument() 


    // Bearbeitung von lieferung, artikel und anzahl
    public void startElement(String nameuri, String local, String quali, 
                             Attributes attrs) 
    // Einlesen von aNummer


    // Bearbeitung von lieferung, artikel
    public void endElement(String nameuri, String local, String quali) 
    // Erzeugen von epreis, gpreis und summe


    // Einlesen von anzahl falls getAnzahl
    public void characters(char ch[], int start, int length) 
}

SAXRechnung.java

Anwendung: lesen eines Lieferscheins und schreiben der Rechnung

Usage: Rechnung <lagerdatei.xml> <lieferung.xml> <rechnung.xml>
public class Rechnung {

    public static void main(String[] args) {

	// Lager einlesen: 
	Document lager = null;
        String lauri = args[0];
            lager = lparser.parse(lauri);


	// Lieferschein einlesen und Rechnung schreiben: 
        String liuri = args[1];
        String reuri = args[2];
        DateiAus red = null;
            red = new DateiAus(reuri);
	DOMLager domLager = new DOMLager(lager); 
	DefaultHandler dh = new SAXRechnung(red,domLager);
            liparser.parse(liuri,dh);
    }
}

Rechnung.java

Das Ergebnis ist die Datei 'rechnung.xml' weiter oben.


© Universität Mannheim, Rechenzentrum, 2000-2003.

Heinz Kredel

Last modified: Sun Jan 26 15:18:57 CET 2003