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