Lager als DOM Objekt
Bestellung zu Lieferschein mit SAX
Lieferschein zu Rechnung mit SAX
Lager: lager.dtd
Bestellung: bestellung.dtd
Lieferschein: lieferschein.dtd
Rechnung; rechnung.dtd
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>
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)
}
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>
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>
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)
}
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);
}
}
Das Ergebnis ist die Datei 'rechnung.xml' weiter oben.
© Universität Mannheim, Rechenzentrum, 2000-2003.
Heinz KredelLast modified: Sun Jan 26 15:18:57 CET 2003