Echt cooles Java. Cleverer Code, Open-Source-Bibliotheken und Projektideen. von Brian D. Eubanks, Dorothea Heymann-Reder. 1.

Größe: px
Ab Seite anzeigen:

Download "Echt cooles Java. Cleverer Code, Open-Source-Bibliotheken und Projektideen. von Brian D. Eubanks, Dorothea Heymann-Reder. 1."

Transkript

1 Echt cooles Java Cleverer Code, Open-Source-Bibliotheken und Projektideen von Brian D. Eubanks, Dorothea Heymann-Reder 1. Auflage Hanser München 2006 Verlag C.H. Beck im Internet: ISBN Zu Inhaltsverzeichnis schnell und portofrei erhältlich bei beck-shop.de DIE FACHBUCHHANDLUNG

2 Echt cooles Java Brian D. Eubanks Cleverer Code, Open-Source-Bibliotheken und Projektideen ISBN Leseprobe Weitere Informationen oder Bestellungen unter sowie im Buchhandel

3 3 Verarbeitung von XML und HTML

4 44 3 Verarbeitung von XML und HTML 3 Verarbeitung von XML und HTML Im vorigen Kapitel hatten wir Strings mit Hilfsmethoden erzeugt, gelesen und verarbeitet. Mit regulären Ausdrücken und der in Kapitel 2 beschriebenen Klasse Scanner können wir nunmehr eigene Parser schreiben, um Daten aus strukturiertem Text herauszuholen. Das geht ganz einfach, wenn man es mit einem einfachen Kontext zu tun hat, aber der Einsatz solcher Techniken bei sehr komplexen Strukturen würde einen hohen Programmieraufwand erforderlich machen. In diesem Kapitel werden wir mit einer sehr gebräuchlichen Art von strukturiertem Text arbeiten: der Extensible Markup Language (XML). Wir betrachten besondere Techniken für die Verarbeitung von XML, generieren einen Parser für ein Nicht-XML-Dokument und konvertieren eine willkürlich ausgewählte Grammatik in ein XML-Dokument. Dieses Kapitel setzt eine gewisse Vertrautheit mit XML voraus. Wir werden uns nicht lange mit den XML-Grundlagen aufhalten, sondern mit einem sehr kurzen Überblick über XML beginnen, um Ihr Gedächtnis aufzufrischen. 3.1 Mal schnell XML: Eine Auffrischung XML ist eine allgemeine Auszeichnungssprache zur Beschreibung von strukturierten, hierarchischen Daten. Die Entwickler von XML wollten eine Sprache erschaffen, die für Computer und Menschen gleichermaßen lesbar ist, und kein binäres Format, das sich nur mit speziellen Werkzeugen verarbeiten lässt. Heute ist XML zwar erst ein paar Jahre alt, hat aber für die Kommunikation zwischen Anwendungen und für viele andere Aspekte der Programmierung bereits große Bedeutung erlangt. Web-Entwicklung, Semantikdarstellung, Konfigurationsdateien und Business-to-Business-Webdienste sind nur einige Beispiele für die vielen Einsatzbereiche von XML: Sie können XML-Dokumente aus jeder beliebigen Programmiersprache oder Plattform erzeugen oder verarbeiten, nicht nur in Java. XML-Dokumente sind stark strukturiert, und alle in ihnen vorliegenden Daten müssen unter einem einzelnen Wurzelelement in Hierarchien gespeichert werden. Wenn ein Dokument diese Vorgabe einhält und zusätzlich einige Syntaxregeln befolgt, nennt man es wohlgeformt. Elemente oder Tags (Auszeichnungen) enthalten die Daten; die Struktur und Namen dieser Tags sind anwendungsspezifisch. XML-Dokumente sind maschinenlesbar, wenn sie wohlgeformt sind. Die XML-Spezifikation beschreibt eine generische Syntax, um ein Dokument in Tokens zu zerlegen, und jeder Dokumenttyp baut mit eigenen Tag- Namen und einer hierarchischen Struktur darauf auf. Simple API for XML (SAX) ist eine API, die XML-Dokumente auf niedriger Ebene liest. Ein SAX-Parser erzeugt Events, die Einzelteile des Dokuments darstellen (beispielsweise Startelemente, Zeichendaten und Endelemente). Ihr Programm lauscht

5 3.1 Mal schnell XML: Eine Auffrischung 45 auf diese Events mit einem Event-Handler. SAX merkt sich keine vergangenen Events, diese Aufgabe muss Ihr Event-Handler übernehmen. Document Object Model (DOM) ist eine API, die ein vollständiges Dokument in den Arbeitsspeicher einliest und als Objekthierarchie speichert, in der die Daten als Baum dargestellt werden. Ihr Programm kann Daten aus dem Dokumentbaum aktiv extrahieren oder modifizieren, indem es DOM-Methoden aufruft, während SAX eher ein passiver Prozess ist (Ihr Programm wartet darauf, Daten zu empfangen). Ein XML-Dokument könnte wie der folgende Text aussehen. Die Tag-Namen und der Textinhalt würden von einer Anwendung in einer für sie sinnvollen Weise interpretiert. In diesem Fall ist die Anwendung ein imaginäres Witzverwaltungssystem: <?xml version="1.0"?> <programmiersprachen> <sprachenname="java"> <witz>eine Insel</witz><witz>ein Drink</witz> </sprache> <sprachenname="c"> <witz>bedeutet</witz><witz>das Meer</witz> <witz>eine Musiknote</witz><witz>ja</witz> </sprache> </programmiersprachen> So blöd dieses Beispiel ist, so zeigt es doch anschaulich, dass Sie Ihre eigenen Tag-Namen anlegen können. Doch am einfachsten erfolgt der Datenaustausch mit anderen Programmen, wenn Sie sich an einen wohlbekannten XML-Standard halten. Links zu einigen gebräuchlichen XML-Standards finden Sie auf der Website zu diesem Buch, Viele Codebeispiele dieses Kapitels, die für die XML-Verarbeitung geschrieben sind, funktionieren auch mit HTML. Wenn das Dokument wohlgeformt ist, kann es als XML verarbeitet werden. Vielleicht möchten Sie ja ein Programm schreiben, das Daten aus einer Webseite extrahiert, oder einen Spider, der den Links eines Dokuments folgt. Ob das Extrahieren der Daten aus einem HTML-Dokument sinnvolle Informationen liefert, ist allerdings eine andere Frage (wie Sie weiter unten in diesem Kapitel noch sehen werden). In diesem Kapitel werden wir auch die Verarbeitung komplexer Strukturen erörtern, die nicht im XML- oder HTML-Format vorliegen. Wir werden einen Parser für das einfache Logdateiformat erstellen, das in Kapitel 2 beschrieben wurde, und das Dateiformat auf dieser Grundlage in XML konvertieren. Dieselben Konzepte lassen sich auch auf die Konvertierung anderer Nicht-XML-Grammatiken in XML übertragen. Sobald Ihre Daten in einem XML-Dokument vorliegen, können Sie sie mit allen Tools und APIs verarbeiten, die für XML zur Verfügung stehen.

6 46 3 Verarbeitung von XML und HTML 3.2 Datenbankdaten auf XML gebürstet: Erzeugung von XML mit WebRowSet Java 5+ In Java 5 und höher gibt es eine bequeme Möglichkeit, Daten aus einer Datenbank in ein XML-Dokument zu laden. Dieses neue Mitglied der JDBC-Familie heißt WebRowSet. Es ist ein Interface aus dem Paket javax.sql.rowset, und die Core-API hat eine Implementierung namens WebRowSetImpl von ihm. Mit dieser Klasse können Sie leicht die Ergebnismenge (das ResultSet) einer Datenbankabfrage in eine XML-Darstellung konvertieren. Aus einer JDBC-Ergebnismenge können Sie dann folgendermaßen ein WebRowSet mit Inhalt füllen: import com.sun.rowset.webrowsetimpl; ResultSet rs = statement.executequery("select * from MyTable"); WebRowSetImpl data = new WebRowSetImpl(); data.populate(rs); data.writexml(system.out); Dieses Beispiel sendet die XML-kodierten Daten an die Konsole, doch man könnte sie e- bensogut an einen Writer oder OutputStream schicken. Wenn Sie ein WebRowSet füllen, werden die Daten vom ursprünglichen ResultSet getrennt, und Sie können die Ergebnismenge, die Anweisung und die Datenbankverbindung schließen. Natürlich setze ich hier voraus, dass Sie sich bereits mit einer Datenbank verbunden und ein Statement-Objekt erzeugt haben. (Wenn Sie nicht genau wissen, wie, schauen Sie bitte auf einer der vielen Websites oder in einem der Bücher nach, wo der Datenbankzugriff mit JDBC erklärt wird.) Sobald die Daten in XML vorliegen, können Sie sie mit jeder nachfolgend in diesem Kapitel beschriebenen XML-Technik verarbeiten, an andere Anwendungen weitergeben oder mit XSL-T in einem anderen Format stylen. Im JDBC-Abschnitt der Java 5- Dokumentation werden die Klasse WebRowSet und ihr XML-Format genauer beschrieben. 3.3 SAX-o-phil: Tag-Beziehungen in SAX Java 1.4+ Wenn Sie masochistisch veranlagt wären, könnten Sie Ihren eigenen XML-Parser schreiben, alle Zeichen einzeln einlesen und die Elemente, den Text und die Attribute aus dem Eingabestrom herausziehen. Um das zu leisten, müsste Ihr Programm jedes Detail der XML-Syntax kennen. Sie müssten Escape-Sequenzen einbeziehen, Elemente und Attribute parsen und Entities ersetzen. Doch nichts davon ist eigentlich nötig, denn für Java sind viele (und gute) XML-Parser bereits erhältlich. SAX ist eine Parsing-Möglichkeit für XML. Mit einem SAX-Parser können Sie eine E- vent-listener-klasse schreiben, die aus dem XML-Dokument mithilfe von Callback-Methoden Daten empfängt, welche die Tokens des Dokuments repräsentieren. Diese Schnittstelle arbeitet auf einer relativ niedrigen Ebene, allerdings nicht ganz so niedrig wie das

7 3.3 SAX-o-phil: Tag-Beziehungen in SAX 47 zeichenweise Einlesen von Daten. Das Schwierigste beim Schreiben von SAX- Programmen ist es, die Dokumenthierarchie im Auge zu behalten, denn der SAX-Parser merkt sich keine Tags und Texte, die zuvor eingetroffen sind. Ihr Programm ist wie ein Pferd mit Scheuklappen: Es sieht immer nur einen kleinen Teil des Gesamtbilds. Doch SAX ist nützlich, da es sehr umfangreiche Dokumente verarbeiten kann, die mit einem Baumverfahren wie DOM nicht zu bewältigen wären. Um komplexere Dokumente zu parsen, sollte man allerdings einen Baum-Ansatz verfolgen, da diese Schnittstelle einfacher und auf einer höheren Ebene als SAX funktioniert. Arbeiten Sie allerdings mit einem Dokument von gewaltiger Größe, so haben Sie keine Wahl. Und wenn das Programm das Dokument aus einem Netzwerk bezieht, weiß es im Voraus nicht, ob die Daten später Ausmaße annehmen, die nicht mehr in den Arbeitsspeicher passen. Da JDK 1.4 dem Java-Core einen SAX-Parser hinzugefügt hat, steht allen Java-Programmen bereits ein solcher Parser zur Verfügung er muss nicht erst installiert werden. Schauen wir uns doch einmal die Arbeitsweise von SAX anhand einer sehr einfachen SAX-Anwendung an. Wir betrachten nur drei Methoden aus dem Interface ContentHandler dem Interface, das Programme implementieren, wenn sie über Events, die vom Parser stammen, informiert werden möchten. Es gibt noch andere Methoden für die esoterischeren Bestandteile einer Dokumentstruktur, doch für viele Anwendungen reicht die Implementierung dieser drei ContentHandler-Methoden bereits aus. Hier sehen Sie einen SAX-Event-Handler für die Verarbeitung von XML-Inhalt: import org.xml.sax.helpers.defaulthandler; import org.xml.sax.saxexception; import org.xml.sax.attributes; /* DefaultHandler ist eine Basisimplementierung von ContentHandler und wenn wir diese Klasse erweitern, müssen wir nicht alle Methoden aus ContentHandler implementieren. */ public class SimplestContentHandler extends DefaultHandler public void startelement(string uri, String localname, String qname, Attributes attributes) throws SAXException System.out.println("Opening tag " + localname + ""); public void characters(char[] ch, int start, int length) throws SAXException String text = new String(ch, start, length); System.out.print(text); public void endelement(string uri, String localname, String qname) throws SAXException System.out.println("Closing tag " + localname); Wie unschwer zu erraten ist, entsprechen diese drei Methoden einem Startelement (öffnendes Tag), den Zeichendaten und einem Endelement (schließendes Tag). Es ist wie ein Sandwich: die öffnenden und schließenden Tags sind die Brote, und dazwischen liegt die Wurst (der Text). Allerdings können noch Käse und Senf dazukommen, denn die Methode characters kann durchaus mehrere Male aufgerufen werden, um einen ganzen Textblock darzustellen! Mit anderen Worten: Ihr Event-Handler muss die Daten aus mehreren Aufru-

8 48 3 Verarbeitung von XML und HTML fen der characters-methode sammeln und irgendwo in einem String oder StringBuffer ablegen. Hier wird die Sache knifflig, denn ehe Sie einem bestimmten Tag Text zuweisen können, müssen Sie wissen, an welcher Stelle des Dokuments Sie sich befinden. Wenn die characters-methode aufgerufen wird, wird zu den Daten keine Kontextinformation mitgeliefert. Viele Anwendungen verwenden boolean-flags, um das Behälterelement des aktuellen Texts zu markieren. Im Folgenden wird ein Beispiel gezeigt, in dem ein java.util.stack die zuletzt betrachteten schließenden Tags im Auge behält. Achten Sie darauf, nicht einfach alles einzusammeln, was Sie in dem char-array finden, da dieses auch den Puffer für das gesamte Dokument enthalten kann! Sie müssen mit den Parametern start und length ermitteln, wie viel von den Daten zum aktuellen Text gehört. Am einfachsten lässt sich dies mit dem String-Konstruktor machen, der nur einen Teil eines Zeichenpuffers kopiert, wie es im letzten Stück des Codebeispiels gezeigt wird. Die Klasse StringBuffer verfügt über eine append-methode mit ähnlichen Parametern. Normalerweise würden Sie den ContentHandler nicht einfach so ausführen. Sie würden einen Treiber benötigen, um eine Parser-Instanz zu erzeugen, Ihren Handler damit verbinden und das Dokument durch den Parser strömen lassen. Der folgende Code erstellt einen Parser, schließt den Handler an und liest ein Dokument aus einem URL: import org.xml.sax.contenthandler; import org.xml.sax.xmlreader; import org.xml.sax.helpers.xmlreaderfactory; public class SimplestSAXDriver public static void main(string[] args) throws Exception XMLReader parser = XMLReaderFactory.createXMLReader(); ContentHandler handler = new SimplestContentHandler(); parser.setcontenthandler(handler); String url = " + "xml/office/ubl-order-1.0-office-example.xml"; parser.parse(url); Wir wollen nun ein SAX-Programm zur Dokumentverarbeitung schreiben. Für das Beispiel werden wir Daten aus einem Universal Business Language (UBL)-Dokument extrahieren. UBL ist ein neuer XML-Standard zur Kodierung von Geschäftsdokumenten wie beispielsweise Bestellungen, Versandbenachrichtigungen und Rechnungen. (Einen Link dazu finden Sie auf der Website zu diesem Buch.) Wir werden eine der Beispieldateien (den soeben verwendeten URL) von der UBL-Spezifikation verwenden: eine Büromaterial-Bestellung von einem Händler. Da das Beispiel die Zeilenelemente der Bestellung in den Mittelpunkt stellt, werde ich einige Details weglassen, um nicht seitenweise XML abdrucken zu müssen. Hier sehen Sie also den allgemeinen Inhalt der Datei: <Order> <!-- Buyer ID, issue date, and total amount go here --> <!-- Buyer party's name and address go here --> <!-- Seller party's name and address go here --> <!-- Delivery date and address go here --> <!-- Delivery terms go here --> <OrderLine> <LineItem> <BuyersID>1</BuyersID> <!-- line item number -->

9 3.3 SAX-o-phil: Tag-Beziehungen in SAX 49 <Quantity quantityunitcode="pkg">5</quantity> <LineExtensionAmount>12.50</LineExtensionAmount> <Item> <Description>Pencils, box #2 red</description> <SellersItemIdentification> <ID> </ID> </SellersItemIdentification> <BasePrice> <PriceAmount>2.50</PriceAmount> </BasePrice> </Item> </LineItem> </OrderLine> <OrderLine>... </OrderLine> <OrderLine>... </OrderLine> </Order> Stellen Sie sich vor, Sie arbeiten für eine Firma, deren Politik es ist, eine besondere Genehmigung für Auftragsposten einzuholen, deren Gesamtwert 30 US$ übersteigt. Wir können ein Programm schreiben, das einen Bericht über die genehmigungspflichtigen Posten schreibt, indem wir das Dokument mit SAX durchlesen und LineExtensionAmount- Werte über 30 suchen. Das wäre einfach, da wir nur nach dem LineExtensionAmount- Tag Ausschau halten müsse. Wir setzen ein boolean-flag, wenn wir das geöffnete Tag finden, und setzen es auf false zurück, sobald das Tag geschlossen wird. Dann holen wir (mit der Methode characters) die Zeichendaten nur so weit ab, wie das Flag true ist. So erhalten wir die Daten für den Dollarbetrag. Wenn wir allerdings noch weitere Kennzeichnungsinformationen abfragen wollten, wie beispielsweise die Beschreibung des Auftragspostens, dann wäre ein besseres Mittel erforderlich, um sich den aktuellen Kontext im Dokument zu merken und die verwandten Daten weiter vorne im Dokument im Auge zu behalten. Um Tag-Hierarchien im Auge zu behalten, könnten wir Elementnamen in der startelement-methode auf einen Stack legen und in der endelement-methode wieder daraus entnehmen. Um den Text festzuhalten, speichern wir ihn einfach in einer Map und verwenden den Tag-Namen als Schlüssel. Das funktioniert jedoch nur, wenn die Tag- Namen in dem Dokument eindeutig sind und wir nichts mit den Attributwerten angestellt haben, doch diese Probleme lassen sich leicht lösen. (Bitte beachten Sie auch, dass diese auf Stacks und Maps beruhende Vorgehensweise in einer Multithreading-Umgebung nicht sicher ist.) Hier sehen Sie unsere neue Handler-Klasse: public class LineItemReportHandler extends DefaultHandler private java.util.stack path = new java.util.stack(); private java.util.hashmap values = new java.util.hashmap(); public void startelement(string uri, String localname, String qname, Attributes attributes) throws SAXException // Elementname auf den Stack legen path.push(localname); // Werte sind in der Map, die den XML-Text aufnimmt // den Text für dieses Element beim Öffnen des Tags entfernen values.put(localname, ""); public void characters(char[] ch, int start, int length) throws SAXException String text = new String(ch, start, length); // Was war das letzte Tag?

10 50 3 Verarbeitung von XML und HTML String currenttag = (String) path.peek(); // Welchen Wert hat bisher der Text darin? String currentvalue = (String) values.get(currenttag); // Aktuellen Text anfügen und in die Map schreiben currentvalue = currentvalue + text; values.put(currenttag, currentvalue); public void endelement(string uri, String localname, String qname) throws SAXException path.pop(); if (localname.equals("lineitem")) String amount = (String) values.get("lineextensionamount"); if (Double.parseDouble(amount) >= 30.0) System.out.print("Quantity "); System.out.print(values.get("Quantity")); System.out.print(" of \""); System.out.print(values.get("Description")); System.out.print("\" costs $"); System.out.println(amount); Dieser SAX-Handler gibt nach der Verarbeitung der UBL-Beispieldatei folgendes Ergebnis aus: Quantity 10 of "Photocopy Paper- case" costs $ Quantity 10 of "Pens, box, blue finepoint" costs $50.00 Quantity 3 of "Tape, 1in case" costs $37.50 Die obige XML-Datei war ein vereinfachtes UBL ohne die Namensraum- oder Schema- Verarbeitung. Links zu UBL und Informationen über Namensräume und Schemata finden Sie auf der Website der Online-Ressourcen zu diesem Buch. 3.4 SAX-o-phon: ContentHandler direkt füttern Java 1.4+ Im vorigen Abschnitt 3.3 zeigten wir, dass Parser anhand der Eingabe aus einem XML- Dokument SAX-Events generieren. Außerdem lernten wir einige der Methoden aus dem Interface ContentHandler kennen. In dem Beispiel schrieben wir einen einfachen Event- Handler zur XML-Verarbeitung und sammelten die Daten in Kellerstapeln und Maps. Manchmal muss man aber auch in umgekehrter Richtung vorgehen, nämlich eigene SAX- Events an einen ContentHandler abfeuern. Dies ist zwar nicht der einfachste Weg zur Erstellung eines Dokuments, aber unter Umständen die einzige Möglichkeit, wenn ein extrem großes Dokument angelegt werden soll. Es ist möglich, einen ContentHandler unmittelbar zu füttern, indem man eine Instanz von ihm anlegt und seine Methoden direkt aufruft. Das folgende Beispiel basiert auf dem einfachen Handler, den wir bereits früher benutzt hatten und der einen Teil des Bestellungsdokuments anlegt, indem er SAX-Events auslöst: ContentHandler handler = new SimplestContentHandler(); handler.startdocument(); //... hier wurde ein Teil des Dokuments weggelassen handler.startelement("", "Item", "Item", new AttributesImpl());

11 3.4 SAX-o-phon: ContentHandler direkt füttern 51 handler.startelement("", "Description", "Description", new AttributesImpl()); String text = "Pencils, box #2 red"; handler.characters(text.tochararray(), 0, text.length()); // nicht vergessen: Elemente in umgekehrter Reihenfolge schließen! handler.endelement("", "Description", "Description"); handler.endelement("", "Item", "Item"); //... hier wurde ein Teil des Dokuments weggelassen handler.enddocument(); Wir beginnen die Dokumentverarbeitung, indem wir zuerst startdocument dann für die öffnenden Tags startelement und für die schließenden endelement aufrufen. Wenn wir ein Tag öffnen, müssen wir außerdem eine Attributes-Collection übergeben, die mithilfe der Klasse AttributesImpl angelegt werden kann (Attributes ist ein Interface und kann nicht direkt instanziiert werden). Selbst wenn Sie keine Attribute hinzufügen, müssen Sie ein leeres Attributes-Objekt übergeben, weil das Interface ContentHandler es verlangt. Der leere String, der an die Start- und Endelemente übergeben wird, ist der XML- Namensraum (engl. namespace). Er wird in diesem Beispiel zwar nicht verwendet, aber das Interface verlangt dennoch einen leeren String als Wert. Das zweite Exemplar des Tag- Namens ist der qualifizierte Name, also ein Tag-Name, dem der Namensraum (obwohl er nicht benutzt wird) als Präfix vorangestellt ist. Da die echte UBL Namensräume und Schemata verwendet, sollten Sie sich mit diesen bereits vertraut machen, wenn Sie UBL in der Produktion einsetzen möchten. Auf der Website mit den Online-Ressourcen finden Sie genauere Informationen. Wenn Sie eine Menge SAX-Events generieren, kann es nützlich sein, einige Hilfsmethoden zu schreiben, die den Code lesbarer machen, wie in diesem Beispiel, das ein UBL- Dokument für einen Bestellungswiderruf anlegt. Auch wenn es ein wenig unkonventionell ist: Eine kleine Einrückung auf jeder Ebene der geschachtelten Tags verbessert die Lesbarkeit des Codes (und erinnert Sie daran, die Tags zu schließen!): handler.startdocument(); open("ordercancellation"); // OrderCancellation-Tag öffnen tagtext("id", " X"); // ID-Tag mit eingebettetem Text tagtext("issuedatetime", " T09:30:47"); tagtext("cancellationnote", "order replaced"); open("orderreference"); tagtext("buyersid", " "); tagtext("issuedate", " "); close("orderreference"); open("buyerparty"); open("party"); open("partyname"); tagtext("name", "Bills Microdevices"); close("partyname"); close("party"); close("buyerparty"); open("sellerparty"); open("party"); open("partyname"); tagtext("name", "Joes Office Supply"); close("partyname"); close("party"); open("ordercontact"); tagtext("name", "Betty Jo Beoloski"); close("ordercontact"); close("sellerparty"); close("ordercancellation"); // OrderCancellation-Tag schließen handler.enddocument();

12 52 3 Verarbeitung von XML und HTML Der Vollständigkeit halber sehen Sie hier die Definition meiner Methoden open, close und tagtext: public class OurSAXGenerator private ContentHandler handler; // wurde vorher initialisiert private void open(string tag) throws SAXException handler.startelement("", tag, tag, new AttributesImpl()); private void close(string tag) throws SAXException handler.endelement("", tag, tag); private void tagtext(string tag, String value) throws SAXException open(tag); handler.characters(value.tochararray(), 0, value.length()); close(tag); Sie können auch noch ausgefeiltere Methoden schreiben, die für Ihre eigene Anwendung sinnvoller sind. Da wir in diesem Beispiel keine Namensraum-Präfixe oder Attribute verwendeten, konnten wir durch den Einsatz selbst erstellter Methoden den Code ordentlicher gestalten. Denken Sie daran, dass es einfachere Möglichkeiten gibt, um XML-Inhalt zu generieren, als einen ContentHandler mit SAX-Events zu füttern, doch aus Performance- Gründen oder wegen der Arbeitsspeicherbeschränkungen im Hinblick auf sehr große Dokumente ist es manchmal nötig, zu diesem Mittel zu greifen. Dies funktioniert aber nur dort, wo XML keine Systemgrenzen überspringen muss, da Ihr Generatorprogramm Zugriff auf die Handler-Instanz benötigt. Im nächsten Abschnitt 3.5 werden noch weitere Techniken für die Arbeit mit SAX-Events vorgestellt. 3.5 SAX-ische Spezialität: ContentHandler gefiltert füttern Java 1.4+ Nun, da Sie einen hungrigen ContentHandler füttern können, wie wir es im letzten Abschnitt 3.4 getan haben, können Sie die SAX-Methoden auch von einem anderen Programmteil aufrufen lassen und sich darauf beschränken, das SAX-Sandwich mit Senf zu bestreichen (oder die Majonäse runterzukratzen). Das ist nicht nur witzig gemeint; es gibt nämlich tatsächlich eine Art von Vorverarbeitung, die Sie den XML-Daten angedeihen lassen können, während Sie sie an einen ContentHandler übergeben. Im vorigen Absatz ü- bergaben Sie SAX-Events direkt an eine ContentHandler-Klasse, ohne einen Parser zu nutzen. Das kann für manche Anwendungen sinnvoll sein; häufiger ist jedoch ein Szenario, bei dem Daten aus einem XML-Dokument gelesen und der Inhalt gefiltert oder hinzugefügt werden, ehe das Dokument verarbeitet wird.

13 3.5 SAX-ische Spezialität: ContentHandler gefiltert füttern 53 Das Interface org.xml.sax.xmlfilter ist eine Kombination aus ContentHandler und XMLReader: ein Parser und Event-Handler in einem. Mithilfe dieses Interfaces können Sie eine Zwischenebene zwischen den Eingabe-Events, die von einem XMLReader kommen, und den Ausgabe-Events, die an den ContentHandler gehen, einziehen. Für den XMLReader sieht es wie ein ContentHandler und für den ContentHandler wie ein XMLReader aus. Abbildung 3.1 zeigt, wie der Filterprozess abläuft. XML Reader Parent XMLFilter Interne Filterung ContentHandler 1. Erzeuge die XMLFilter-Instanz. 2. Rufe die setparent-methode des Filters auf. 3. Rufe die Methode setcontenthandler auf. 4. Rufe die parse-methode des Filters auf. Content Handler Abbildung 3.1: XMLFilter-Fluss Da dieses Interface viele Methoden hat, werden Sie möglicherweise die Standardimplementierung verwenden, anstatt alles von Grund auf neu zu schreiben. Für diesen Zweck gibt es die Klasse XMLFilterImpl im Paket org.xml.sax.helpers. Die Standardimplementierung sendet SAX-Methoden direkt an den verbundenen Event-Handler. Dabei kommt ein Dokument heraus, das exakt der Eingabe entspricht. Um einen Filter zu erstellen, erweitern Sie die Klasse, indem Sie die ContentHandler-Methoden überschreiben. Wenn die überschriebenen SAX-Methoden im Filter von dem übergeordneten XMLReader aufgerufen werden, werden die Events an den Ziel-Handler nur dann übergeben, wenn Sie

14 54 3 Verarbeitung von XML und HTML die entsprechende Oberklassenmethode aufrufen (z.b. super.characters). Auf dieselbe Weise können Sie neue Inhalte erstellen oder vorhandene modifizieren, indem Sie die Methoden super.startelement und super.endelement mit den Daten aufrufen, die Sie an den Ziel-Handler übergeben möchten. Im folgenden Code habe ich einen Filter implementiert, der Tags und Text in einem Ignore -Tag übergeht: import org.xml.sax.attributes; import org.xml.sax.saxexception; import org.xml.sax.helpers.xmlfilterimpl; public class IgnoringFilter extends XMLFilterImpl // Dieser Filter funktioniert nicht mit geschachtelten Ignore-Tags! boolean ignoring = false; public void startelement(string url, String localname, String qname, Attributes att) throws SAXException if (localname.equals("ignore")) ignoring = true; if (!ignoring) super.startelement(url, localname, qname, att); public void characters(char[] data, int start, int length) throws SAXException if (!ignoring) super.characters(data, start, length); public void endelement(string url, String localname, String qname) throws SAXException if (localname.equals("ignore")) ignoring = false; else if (!ignoring) super.endelement(url, localname, qname); Um den Filter einzusetzen, gehen Sie folgendermaßen vor: XMLReader parser = XMLReaderFactory.createXMLReader(); ContentHandler handler = new SimplestContentHandler(); IgnoringFilter filter = new IgnoringFilter(); filter.setcontenthandler(handler); filter.setparent(parser); filter.parse("c:/projects/wcj3/test.xml"); Beachten Sie, dass der Filter in manchen Fällen nicht alle Events abfangen wird, da wir nur die drei SAX-Methoden implementiert haben. Das gilt zum Beispiel für die Zuordnung der Namensraum-Präfixe und die Whitespace-Zeichen. Um einen kompletten Filter für alle Lebenslagen zu bekommen, müssen Sie eventuell auch andere Methoden aus dem SAX- Interface implementieren. In der Dokumentation zu ContentHandler und XMLFilter des JDK finden Sie genauere Informationen. Sie können auch mehrere Filter aneinanderhängen. Wir werden nun einen weiteren Filter hinzufügen, der ein signedby-attribut in jedes Element des Dokuments einfügt. Die Filterklasse sehen Sie hier: import org.xml.sax.attributes; import org.xml.sax.saxexception;

15 3.6 Aus-Lese: XML-Dokumente mit DOM4J lesen 55 import org.xml.sax.helpers.attributesimpl; import org.xml.sax.helpers.xmlfilterimpl; public class SignatureFilter extends XMLFilterImpl public void startelement(string url, String localname, String qname, Attributes att) throws SAXException // beginne mit den vorhandenen Attributen AttributesImpl moreatt = new AttributesImpl(att); // füge neues Attribut hinzu: // Typ ist CDATA, Name ist signedby, Wert ist SignatureFilter moreatt.addattribute("", "signedby", "signedby", "CDATA", "SignatureFilter"); // übergib dies an den Listener super.startelement(url, localname, qname, moreatt); Diesen Filter verketten wir nun mit dem, den wir weiter oben angelegt hatten: XMLReader parser = XMLReaderFactory.createXMLReader(); IgnoringFilter filter = new IgnoringFilter(); SignatureFilter signer = new SignatureFilter(); signer.setcontenthandler(new SimplestContentHandler()); filter.setcontenthandler(signer); filter.setparent(parser); filter.parse("c:/projects/wcj3/test.xml"); Dies erzeugt einen in zwei Phasen arbeitenden Filter. Die Daten werden vom XMLReader (dem Parser) übergeben, gehen durch den IgnoringFilter in den SignatureFilter und dann an den Ziel-Content-Handler, nämlich SimplestContentHandler. Mit solchen Prozessflüssen können Sie komplexen XML-Inhalt unter Verwendung von SAX-Events in mehreren Phasen erstellen. Wenn Sie die gefilterten SAX-Events in einen Dokumentbaum einlesen, können Sie ausgewählte Teile eines sehr großen XML-Dokuments verarbeiten, das normalerweise nicht in den Arbeitsspeicher passen würde. Diese Möglichkeit wird in einem späteren Abschnitt noch genauer untersucht. 3.6 Aus-Lese: XML-Dokumente mit DOM4J lesen DOM 4J DOM-Programme sind oft umständlich und schwer lesbar. Manche der DOM-Methoden zum Lesen und Bearbeiten von XML sind nicht gerade die besten. Das Open-Source- Projekt DOM4J stellt eine bessere API zur Verfügung, die XML viel reibungsloser verarbeitet. Da sie nicht zum Java-Core gehört, müssen Sie allerdings die DOM4J-Bibliothek herunterladen und Ihrem Klassenpfad hinzufügen. Manche DOM4J-Objekte sind Analogien von DOM-Objekten, haben aber eine andere API und verwenden andere Methoden und Klassen. Passen Sie nur auf, dass Sie nicht die DOM-Klassen und -Pakete des Java- Core mit denen von DOM4J durcheinander bringen! Den größten Unterschied zwischen den beiden werden Sie beim Lesen von XML-Dokumenten feststellen. Um diesen Unterschied zu veranschaulichen, werden wir nun Daten aus einer UBL-Bestellung (wie in den obigen Beispielen beschrieben) mithilfe von DOM lesen und dann den entsprechenden

16 56 3 Verarbeitung von XML und HTML DOM4J-Code zeigen. Sehen Sie hier als Erstes den DOM-Code zum Laden des Dokuments und zum Abfragen der Werte von BuyersID, IssueDate und LineExtensionTotalAmount: // Dies ist DOM-Code. Die Importe wurden zur Abkürzung weggelassen DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); DocumentBuilder parser = fact.newdocumentbuilder(); String url = "C:/projects/wcj3/purchaseOrder.xml"; Document doc = parser.parse(url); // hole das Wurzelelement Element root = doc.getdocumentelement(); NodeList list = root.getelementsbytagname("buyersid"); Element idelem = (Element) list.item(0); String buyersid = idelem.gettextcontent(); System.out.println("Buyers ID is " + buyersid); list = root.getelementsbytagname("issuedate"); Element issueelem = (Element) list.item(0); String issuedate = issueelem.gettextcontent(); System.out.println("Issue date is " + issuedate); list = root.getelementsbytagname("lineextensiontotalamount"); Element totalelem = (Element) list.item(0); String total = totalelem.gettextcontent(); System.out.println("Total amount is " + total); Die ersten vier Anweisungen laden den Parser und parsen das XML-Dokument in ein DOM-Dokumentobjekt. Dann holen wir das Wurzelelement. Der fett gedruckte Code ist der komplizierteste Teil von DOM. Für jeden der drei Werte müssen wir zuerst das Kindelement nach dem Namen abrufen und seinen Kind-Text beschaffen. Hierfür hat das DOM eine Methode, die eine Knotenliste zurückgibt. Wir holen das erste Element der Liste und den unter ihm stehenden Text, indem wir gettextcontent aufrufen. Der entsprechende DOM4J-Code sieht dagegen viel sauberer aus: // Dies ist DOM4J-Code. String url = "C:/projects/wcj3/purchaseOrder.xml"; org.dom4j.io.saxreader reader = new org.dom4j.io.saxreader(); org.dom4j.document doc = reader.read(url); org.dom4j.element root = doc.getrootelement(); String buyersid = root.elementtext("buyersid"); System.out.println("Buyers ID is " + buyersid); String issuedate = root.elementtext("issuedate"); System.out.println("Issue date is " + issuedate); String total = root.elementtext("lineextensiontotalamount"); System.out.println("Total amount is " + total); Beachten sie, dass hier die Klassen org.dom4j.document und org.dom4j.element aus DOM4J stammen, es sind nicht die aus DOM! Die fett gedruckten Zeilen sind äquivalent zu den fett gedruckten Zeilen aus dem DOM-Beispiel. Wie Sie sehen, hat DOM4J eine sehr bequeme Art, Text aus einem Kindelement abzufragen. DOM4J hat noch andere Methoden für eine einfache Verarbeitung von XML-Daten. Das folgende Beispiel gibt die Käufer- und Verkäuferdaten aus der Bestellung zurück. Wenn wir dieselbe DOM4J-doc-Instanz wie zuvor zugrunde legen (org.dom4j.document), finden wir den Namen, die Firma und die Adresse des Käufers, indem wir den Baum durchsuchen: // Dies ist DOM4J-Code Element root = doc.getrootelement(); // hole Element für root->buyerparty->party Element party = root.element("buyerparty").element("party");

17 3.7 Nicht fad, der Pfad: Daten extrahieren mit XPath 57 // hole Firmenname aus Party->PartyName->Name String company = party.element("partyname").elementtext("name"); // Party->Address Element address = party.element("address"); // Address -> StreetName, BuildingNumber, etc String street = address.elementtext("streetname"); String building = address.elementtext("buildingnumber"); String city = address.elementtext("cityname"); String zip = address.elementtext("postalzone"); String state = address.elementtext("countrysubentitycode"); // Party->Contact->Name String contact = party.element("contact").elementtext("name"); Wenn Sie sich die API zur XML-Verarbeitung aussuchen können, wird Ihr Code mit DOM4J sauberer und wartungsfreundlicher sein. Überdies kann DOM4J mit DOM- und SAX-Parsern zusammenarbeiten, sodass Sie ganz einfach Ihr DOM4J-Programm in vorhandenen Code integrieren können. Und zusätzlich hat es noch viele andere nette Features. Eines davon wird im nächsten Abschnitt beschrieben. 3.7 Nicht fad, der Pfad: Daten extrahieren mit XPath DOM 4J Im vorigen Abschnitt 3.6 zeigten wir, wie Sie mit DOM4J-Daten aus einem XML-Dokument lesen können. Mit den Methoden element und elementtext holten wir Daten aus Baumelementen heraus. Hier lernen Sie eine andere Möglichkeit kennen, einen DOM4J- Baum zu durchqueren: eine Ausdruckssprache namens XPath. Mit XPath können wir einen Pfad von der Dokumentwurzel bis zu jedem beliebigen Punkt im Baum gehen, indem wir eine Abkürzung verwenden, die ein wenig wie der Verzeichnispfad von Unix aussieht. Wir wollen wieder das XML der Warenbestellung als Beispiel heranziehen. Die Allgemeinen Geschäftsbedingungen finden wir, indem wir vom Wurzelelement Order bis zu seinem Kindelement DeliveryTerms und dann zu dem Kindelement SpecialTerms und seinem Text gehen. Dies können Sie mit dem folgenden XPath-Ausdruck sagen: /Order/DeliveryTerms/SpecialTerms In DOM4J können Sie sehr einfach den Wert dieses Ausdrucks als String abrufen. So erhalten Sie den Text unterhalb des Tags SpecialTerms: String terms = doc.valueof("/order/deliveryterms/specialterms"); Diese Methode funktioniert mit jeder Art von DOM4J-Node, wie beispielsweise Element oder Document, und sie kann sogar ein relativer Ausdruck sein, der einen Wert in Abhängigkeit vom aktuellen Knoten ermittelt. Sie können den Wert eines XPath-Ausdrucks als Node abrufen, der Text und möglicherweise weitere Kindelemente enthält. Es gibt eine Version, die einen einzelnen Knoten zurückgibt, und eine, die eine java.util.list-knotenliste liefert (zur Bearbeitung mehrerer passender Ergebnisse). Um dies zu veranschaulichen, wollen wir nun die Zeilenelemente aus dem Bestelldokument lesen: List items = doc.selectnodes("/order/orderline"); Iterator iter = items.iterator();

18 58 3 Verarbeitung von XML und HTML while (iter.hasnext()) Element orderline = (Element) iter.next(); String qty = orderline.valueof("lineitem/quantity"); String desc = orderline.valueof("lineitem/item/description"); String price = orderline.valueof("lineitem/item/baseprice/priceamount"); System.out.println(qty + " " + desc + " at " + price); Die erste Codezeile liest die Elemente der Bestellung in eine Knotenliste (List) ein. Wir durchlaufen diese Liste mit relativen XPath-Ausdrücken, um den Text jedes Elements zu extrahieren. Mit XPath konnten wir mit wenigen Codezeilen einen weitaus größeren Teil des Dokuments lesen. XML (und HTML) in DOM4J zu erzeugen ist genauso einfach. Im nächsten Beispiel nutzen wir DOM4J, um eine XHTML-Seite zum Anzeigen der vorhin gesammelten Elemente zu erzeugen. XHTML ist HTML-Inhalt, der zugleich korrektes XML ist (in dem beispielsweise Tags richtig geschlossen werden und Attribute in Anführungszeichen stehen). Wenn das Programm läuft, erzeugt es eine HTML-Ausgabedatei, wie Abbildung 3.2. veranschaulicht Abbildung 3.2: HTML-Ergebnis von DOM4J Wir erstellen als Erstes ein neues Dokument mit der Methode createdocument von DocumentHelper. Dann rufen wir, wenn nötig, die Methoden addelement und addtext auf, um den HTML-Inhalt zu erzeugen. In diesem Beispiel arbeiten wir mit zwei DOM4J- Dokumenten: einem zum Lesen der XML-Eingabe und einem zum Generieren der HTML- Ausgabedatei. Vor dem Programmcode sehen Sie hier die Importe: import java.io.filewriter; import java.io.ioexception; import java.util.iterator; import java.util.list; import org.dom4j.document; import org.dom4j.documentexception;

19 3.7 Nicht fad, der Pfad: Daten extrahieren mit XPath 59 import org.dom4j.documenthelper; import org.dom4j.element; import org.dom4j.io.htmlwriter; import org.dom4j.io.outputformat; import org.dom4j.io.saxreader; Und hier folgt der Code, allerdings ohne Exception-Handling: // Lies das XML-Eingabedokument (purchase order) String url = "C:/projects/wcj3/purchaseOrder.xml"; SAXReader reader = new SAXReader(); Document po = reader.read(url); // Erzeuge die Ausgabe als HTML-Dokumentobjekt Document htmldoc = DocumentHelper.createDocument(); // Füge einen Titel mit der extrahierten Kundennummer hinzu String buyerid = po.valueof("/order/buyersid"); String title = "Purchase Order #" + buyerid; // Erzeuge das HTML-Wurzelelement und den Dokumenttitel Element html = htmldoc.addelement("html"); html.addelement("head").addelement("title").settext(title); // Erzeuge einen Body-Tag und die H1-Titelüberschrift Element body = html.addelement("body"); body.addelement("h1").addtext(title); // Lege die HTML-Tabelle mit Rand an Element table = body.addelement("table").addattribute("border", "1"); // Lege Überschriftzeile an Element header = table.addelement("tr"); header.addelement("th").addtext("quantity"); header.addelement("th").addtext("description"); header.addelement("th").addtext("price"); header.addelement("th").addtext("subtotal"); // Hole die Liste der Zeilenelemente des Dokuments List items = po.selectnodes("/order/orderline"); Iterator iter = items.iterator(); while (iter.hasnext()) Element item = (Element) iter.next(); // Füge eine Tabellenzeile hinzu Element row = table.addelement("tr"); // Füge eine Zelle für die Mengenangabe hinzu row.addelement("td").addtext(item.valueof("lineitem/quantity")).addattribute("align","right"); // Füge eine Zelle für die Beschreibung hinzu row.addelement("td").addtext(item.valueof("lineitem/item/description")); // Füge eine Zelle für den Stückpreis hinzu String priceamount = item.valueof("lineitem/item/baseprice/priceamount"); row.addelement("td").addtext(priceamount).addattribute("align","right"); // Füge eine Zelle für die Zwischensumme hinzu row.addelement("td").addtext(item.valueof("lineitem/lineextensionamount")).addattribute("align","right"); // Erstelle die Zeile für die Gesamtsumme Element totalrow = table.addelement("tr"); totalrow.addelement("th").addattribute("colspan", "3").addText("Total"); String total = po.valueof("/order/lineextensiontotalamount"); totalrow.addelement("th").addtext(total);

20 60 3 Verarbeitung von XML und HTML // Sende das HTML-Ausgabedokument als Strom auf die Festplatte // Mit "pretty printing" produzieren wir leicht lesbares HTML // Ohne diese Maßnahme hätten die Tags weder Einrückung noch Whitespace OutputFormat format = OutputFormat.createPrettyPrint(); FileWriter file = new FileWriter("order.html"); HTMLWriter writer = new HTMLWriter(file, format); writer.write(htmldoc); writer.close(); Dieser Code zeigt, auf welch ungewöhnliche Weise DOM4J-Programme oft ihre Methodenaufrufe aneinander hängen, wenn sie Kindelemente anlegen. Diese Verkettung ist möglich, da die Methode addelement das neu erzeugte Element zurückgibt und die Methoden addtext und addattribute das Originalelement (dem Sie den Text hinzugefügt hatten). Wenn Sie noch nie mit HTML gearbeitet haben, müssen Sie vielleicht in einer HTML- Referenz nachschlagen (siehe Website zu diesem Buch), um die Tabellen-Tags und die Attribute zu verstehen, die das Layout einer Tabelle beeinflussen. Um keine Verwechslung der Elements, die zum Lesen der Daten verwendet werden, und der Elements, die zur Erstellung der Ausgabe verwendet werden, zu riskieren, habe ich die Daten fast nur durch XPath-Ausdrücke extrahiert (indem ich die Methode valueof auf dem po-objekt aufrief). Das einzige Element, das Eingabedaten darstellt, ist die Variable item in der while- Schleife, und diese enthält die aktuelle Zeile, die gerade verarbeitet wird. Alle anderen E- lements werden zur Erstellung des Ausgabedokuments benutzt. Diese HTML-Erzeugung hätte auch durch ein XSL-Stylesheet ganz ohne Java-Code erledigt werden können. Auf der Website zu diesem Buch finden Sie Links zu Informationen, die Ihnen verraten, wie Sie mit XSL aus einer XML-Datei HTML erstellen. 3.8 Unsichtbare Tags: Dokumente vor dem Laden in DOM4J filtern DOM 4J Java 1.4+ Wenn Sie ein XML-Dokument in DOM4J laden, muss es klein genug sein, um vollständig in den Arbeitsspeicher zu passen. Für sehr große Dokumente besteht allerdings die Möglichkeit, sie vor dem Einlesen in den Arbeitsspeicher zu filtern. Etwas Ähnliches haben wir im Abschnitt 3.5 ( SAX-ische Spezialität: ContentHandler gefiltert füttern ) bereits gesehen, als wir die SAX-Events mit einem SAXFilter herausfilterten. Doch anstatt einen Baum aufzubauen, verarbeitete unser Programm die SAX-Events unmittelbar. Die meisten Dokumentobjekt-Bäume werden ursprünglich aus SAX-Events erstellt. Indem Sie jedoch zwischen die SAX-Events und den Handler, der den Baum erzeugt, einen XMLFilter stellen, können Sie einen Teil des Inhalts für den Baumerstellungsprozess unsichtbar machen. Diese Baumfilterung lässt sich an dem Beispiel mit der Bestellung verdeutlichen. Wir wollen jetzt lediglich die Daten des Verkäufers in einen DOM4J-Baum laden, die nur einen kleinen Teil des Dokuments darstellen. Erinnern Sie sich an den Beginn dieses Abschnitts

21 3.8 Unsichtbare Tags: Dokumente vor dem Laden in DOM4J filtern : Eine Bestellung in der UBL enthält die Daten des Käufers (Buyer) und Verkäufers (Seller) sowie die Lieferbedingungen (DeliveryTerms) und die Auftragspositionen (OrderLine) mit ihren Einzelposten (LineItem). Im Folgenden sehen Sie eine Kurzversion des bisher in diesem Kapitel verwendeten XML, aus der die übergeordnete Struktur des Dokuments ersichtlich ist: <Order> <BuyersID> </BuyersID> <IssueDate> </IssueDate> <LineExtensionTotalAmount>438.50</LineExtensionTotalAmount> <BuyerParty> <!-- buyer name, address, contact information --> </BuyerParty> <SellerParty> <!-- seller name, address, contact information --> </SellerParty> <Delivery> <!-- delivery date, time, and address --> </Delivery> <DeliveryTerms> <SpecialTerms>Signature Required</SpecialTerms> </DeliveryTerms> <OrderLine> <LineItem> <!-- line item details --> </LineItem> </OrderLine> <OrderLine> <LineItem> <!-- line item details --> </LineItem> </OrderLine> <!-- more line items... --> </Order> Auch wenn es im wirklichen Leben eher unwahrscheinlich sein mag: Stellen Sie sich vor, Sie haben ein extrem großes Bestellungsdokument im Umfang von vielen Gigabytes. (Wir befinden uns in einer fernen Zukunft, und es handelt sich um die Bestellung von Ersatzteilen für den Warp-Antrieb eines Raumschiffs.) Die Chefin will, dass nur die Verkäuferdaten aus dem Dokument angezeigt werden, und verlangt die Verwendung einer Baumstruktur. Natürlich können wir nicht einfach das ganze Dokument in den Baum laden (jedenfalls nicht auf meinem heutigen Computer). Das würde nicht nur den Arbeitsspeicher überfordern, sondern wäre auch Platzverschwendung, da wir nur einen Teil des Dokuments benötigen. Also erstellen wir wie vorhin einen Filter, der alles außer den Verkäuferdaten ignoriert. Hierzu schreiben wir eine Unterklasse von XMLFilterImpl, die nur Inhalte zwischen einem SellerParty-Start-Tag und dem dazugehörigen End-Tag als Ausgabe an den SAX- Handler schickt. Hier sehen Sie eine stark vereinfachte Version dieses Filters: public class SellerFilter extends XMLFilterImpl private boolean ignoring = true; public void startelement(string url, String localname, String qname, Attributes att) throws SAXException if (localname.equals("sellerparty")) ignoring = false; if (!ignoring)

22 62 3 Verarbeitung von XML und HTML super.startelement(url, localname, qname, att); public void characters(char[] arg0, int arg1, int arg2) throws SAXException if (!ignoring) super.characters(arg0, arg1, arg2); public void endelement(string url, String localname, String qname) throws SAXException if (!ignoring) super.endelement(url, localname, qname); if (localname.equals("sellerparty")) ignoring = true; Der Filter dreht den Hahn auf, wenn er auf das richtige öffnende Tag stößt (SellerParty) und dreht den Hahn wieder zu, wenn das schließende Tag auftaucht. Um diesen Filter in den DOM4J-Builder zu integrieren, setzen wir ihn zwischen den SAX-Parser, der den Eingabestrom erzeugt, und den Builder, der den Baum aufbaut. Die Klasse SAXReader in DOM4J hat eine wunderbare Methode namens setxmlfilter, um dieses zu erledigen: org.dom4j.io.saxreader parser = new org.dom4j.io.saxreader(); SellerFilter filter = new SellerFilter(); parser.setxmlfilter(filter); org.dom4j.document doc = parser.read("c:/projects/wcj3/test.xml"); Darüber hinaus verfügt DOM4J über einen eigenen Baumschnitt-Mechanismus, der sich ein wenig vom SAX-Filterprozess unterscheidet. Die DOM4J-Dokumentation beschreibt den anderen Ansatz und stellt Codebeispiele vor. In dem Beispiel des vorliegenden Abschnitts wurde derselbe Filterprozess wie von SAX verwendet, da er allgemeingültiger ist und der resultierende Filter auch als Teil einer Kette von SAX-Filtern eingesetzt werden könnte. 3.9 Sinn-Taxen: Parser für alle Lebenslagen mit JavaCC JavaCC Manchmal haben Sie das Glück, mit Daten arbeiten zu können, die eine wohlbekannte Syntax aufweisen, wie zum Beispiel XML oder HTML. Dies war auch bisher in diesem Kapitel der Fall. In solchen Fällen können Sie auf bereits vorhandene Parser zurückgreifen. Doch für andere Datenstrukturen kann es sein, dass Sie einen eigenen Parser schreiben müssen. Im Grunde haben wir genau dies in Kapitel 2 im Abschnitt 2.7 ( Vertrackt, aber geknackt: Komplexe Syntax mit der Scanner-Klasse parsen ) bereits getan: Wir kodierten unsere Kenntnis der Grammatik, die Beziehungen zwischen allen Teilen der Daten, in das Programm selbst ein. Wenn bei der Umwandlung der Grammatik in Programmlogik keine Fehler auftreten, funktioniert das ganz prima. Doch bei komplexen Grammatiken steigt die

23 3.9 Sinn-Taxen: Parser für alle Lebenslagen mit JavaCC 63 Gefahr von Logikfehlern, und das Programm ist viel schwerer zu schreiben und zu warten. Dies ist der Grund dafür, warum fast jeder einen vorhandenen Parser für XML oder HTML benutzt, anstatt einen eigenen zu schreiben! Wenn Sie eine Grammatik für etwas anderes etwa eine benutzerdefinierte Sprache verarbeiten möchten, ist es besser, die Regeln der Grammatik zuerst in einer Spezifikationssprache zu kodieren. Dann, nachdem Sie die Grammatikregeln selbst getestet haben, können Sie um diese Grammatik herum einen Parser bauen. Sie können nachts besser schlafen, wenn Sie wissen, dass die Grammatik korrekt ist, bevor Sie damit beginnen, die Programmlogik zu schreiben. Um strukturierten Text zu verarbeiten, müssen Sie ihn vorab in Tokens zerlegen, also in Objekte, die unteilbare Dateneinheiten darstellen. Die Erstellung von Tokens aus einem Eingabetext bezeichnet man als Scannen (oder auch als lexikalische Analyse oder Lexing). So werden beispielsweise beim Scannen eines mathematischen Ausdrucks alle Zahlen, Variablennamen, Funktionsnamen, Klammern und Operatoren getrennte Tokens. Weiter oben haben wir bereits eine einfache lexikalische Analyse vorgenommen, als wir den Domain- Namen aus einer URL herausholten, indem wir einen regulären Ausdruck mit Capturing Groups verwendeten. Man kann sagen, dass jede Capturing Group ein Token erstellt. Wenn eine Anwendung einen Eingabestrom in Tokens zerlegt, bekommt sie eine Liste von Objekten, welche die Tokens in der Reihenfolge ihres Auftretens im Text repräsentieren. Im nächsten Schritt muss eine Datenstruktur ein abstrakter Syntaxbaum (abstract syntax tree, AST) aufgebaut werden, um die Beziehungen zwischen den Tokens darzustellen. Ein mathematischer Ausdruck ist ein häufig auftretender Typ eines Syntaxbaums, ein XML-Dokument ist ein anderer. Ein Parser verarbeitet einen Eingabestrom, um einen AST auf der Grundlage einer Grammatik zu erstellen, die beschreibt, welche Tokens in dem Baum zulässig sind und nach welchen Regeln sie gebraucht werden. Parser werden normalerweise aus einer Grammatikspezifikation generiert und nicht manuell programmiert. Ein Parser-Generator konvertiert die Grammatik in ein Programm, welches diese Grammatik erkennt. Betrachten wir einmal eine einfache Grammatik, nämlich die der weiter oben beschriebenen Logdatei: eventtype year month day time type-dependent-data Wir werden nun mit einem Open-Source-Parser-Generator namens JavaCC einen Javabasierten Parser aus einer Grammatikspezifikation erstellen. Jede Grammatik besteht aus einer Reihe von Produktionsregeln, die erklären, wie der Syntaxbaum aus den Tokens aufgebaut wird. Der JavaCC-Compiler liest eine.jj-datei, in der die Grammatikregeln beschrieben sind, und generiert den Java-Quellcode für einen Parser. Die Eingabedatei enthält ebenfalls Java-Code für die Logik, die zusätzlich noch in die Parser-Klasse eingebunden werden soll. Der erste Teil einer.jj-datei definiert den Kern der Parser-Klasse. PARSER_BEGIN(LogParser) public class LogParser public static void main(string[] args) try LogParser parser = new LogParser(System.in); parser.alllines(); catch (ParseException e) System.out.println("Error: This is not a valid file.");

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016 Referentin: Dr. Kelly Neudorfer Universität Hohenheim Was wir jetzt besprechen werden ist eine Frage, mit denen viele

Mehr

... MathML XHTML RDF

... MathML XHTML RDF RDF in wissenschaftlichen Bibliotheken (LQI KUXQJLQ;0/ Die extensible Markup Language [XML] ist eine Metasprache für die Definition von Markup Sprachen. Sie unterscheidet sich durch ihre Fähigkeit, Markup

Mehr

Professionelle Seminare im Bereich MS-Office

Professionelle Seminare im Bereich MS-Office Serienbrief aus Outlook heraus Schritt 1 Zuerst sollten Sie die Kontakte einblenden, damit Ihnen der Seriendruck zur Verfügung steht. Schritt 2 Danach wählen Sie bitte Gerhard Grünholz 1 Schritt 3 Es öffnet

Mehr

Anleitung über den Umgang mit Schildern

Anleitung über den Umgang mit Schildern Anleitung über den Umgang mit Schildern -Vorwort -Wo bekommt man Schilder? -Wo und wie speichert man die Schilder? -Wie füge ich die Schilder in meinen Track ein? -Welche Bauteile kann man noch für Schilder

Mehr

4 Aufzählungen und Listen erstellen

4 Aufzählungen und Listen erstellen 4 4 Aufzählungen und Listen erstellen Beim Strukturieren von Dokumenten und Inhalten stellen Listen und Aufzählungen wichtige Werkzeuge dar. Mit ihnen lässt sich so ziemlich alles sortieren, was auf einer

Mehr

Mind Mapping am PC. für Präsentationen, Vorträge, Selbstmanagement. von Isolde Kommer, Helmut Reinke. 1. Auflage. Hanser München 1999

Mind Mapping am PC. für Präsentationen, Vorträge, Selbstmanagement. von Isolde Kommer, Helmut Reinke. 1. Auflage. Hanser München 1999 Mind Mapping am PC für Präsentationen, Vorträge, Selbstmanagement von Isolde Kommer, Helmut Reinke 1. Auflage Hanser München 1999 Verlag C.H. Beck im Internet: www.beck.de ISBN 978 3 446 21222 0 schnell

Mehr

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1 Wenn der Name nicht gerade www.buch.de oder www.bmw.de heißt, sind Internetadressen oft schwer zu merken Deshalb ist es sinnvoll, die Adressen

Mehr

Dokumentation IBIS Monitor

Dokumentation IBIS Monitor Dokumentation IBIS Monitor Seite 1 von 16 11.01.06 Inhaltsverzeichnis 1. Allgemein 2. Installation und Programm starten 3. Programmkonfiguration 4. Aufzeichnung 4.1 Aufzeichnung mitschneiden 4.1.1 Inhalt

Mehr

Primzahlen und RSA-Verschlüsselung

Primzahlen und RSA-Verschlüsselung Primzahlen und RSA-Verschlüsselung Michael Fütterer und Jonathan Zachhuber 1 Einiges zu Primzahlen Ein paar Definitionen: Wir bezeichnen mit Z die Menge der positiven und negativen ganzen Zahlen, also

Mehr

Unsere Webapplikation erweitern

Unsere Webapplikation erweitern Unsere Webapplikation erweitern Um die Webapplikation zu benutzen: 1. Starten Sie den Server, indem Sie das Hauptprogramm in der Klasse ImdbServer starten. 2. Laden Sie im Browser die Seite http://localhost:8080/html/index.html.

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Zwischenablage (Bilder, Texte,...)

Zwischenablage (Bilder, Texte,...) Zwischenablage was ist das? Informationen über. die Bedeutung der Windows-Zwischenablage Kopieren und Einfügen mit der Zwischenablage Vermeiden von Fehlern beim Arbeiten mit der Zwischenablage Bei diesen

Mehr

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert

Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Beamen in EEP Das sogenannte Beamen ist auch in EEP möglich ohne das Zusatzprogramm Beamer. Zwar etwas umständlicher aber es funktioniert Zuerst musst du dir 2 Programme besorgen und zwar: Albert, das

Mehr

4. BEZIEHUNGEN ZWISCHEN TABELLEN

4. BEZIEHUNGEN ZWISCHEN TABELLEN 4. BEZIEHUNGEN ZWISCHEN TABELLEN Zwischen Tabellen können in MS Access Beziehungen bestehen. Durch das Verwenden von Tabellen, die zueinander in Beziehung stehen, können Sie Folgendes erreichen: Die Größe

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine PhotoLine S/W mit PhotoLine Erstellt mit Version 16.11 Ich liebe Schwarzweiß-Bilder und schaue mir neidisch die Meisterwerke an, die andere Fotografen zustande bringen. Schon lange versuche ich, auch so

Mehr

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten

Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten Version 1.0 Wordpress: Blogbeiträge richtig löschen, archivieren und weiterleiten In unserer Anleitung zeigen wir Dir, wie Du Blogbeiträge

Mehr

Technische Dokumentation SilentStatistikTool

Technische Dokumentation SilentStatistikTool Technische Dokumentation SilentStatistikTool Version 1.0 Marko Schröder 1115063 Inhalt Einleitung... 3 Klasse Program... 3 Klasse ArgumentHandler... 3 Bereitgestellte Variablen... 3 Bereitgestellte Methoden...

Mehr

Datenbanken Kapitel 2

Datenbanken Kapitel 2 Datenbanken Kapitel 2 1 Eine existierende Datenbank öffnen Eine Datenbank, die mit Microsoft Access erschaffen wurde, kann mit dem gleichen Programm auch wieder geladen werden: Die einfachste Methode ist,

Mehr

WEBSEITEN ENTWICKELN MIT ASP.NET

WEBSEITEN ENTWICKELN MIT ASP.NET jamal BAYDAOUI WEBSEITEN ENTWICKELN MIT ASP.NET EINE EINFÜHRUNG MIT UMFANGREICHEM BEISPIELPROJEKT ALLE CODES IN VISUAL BASIC UND C# 3.2 Installation 11 Bild 3.2 Der Webplattform-Installer Bild 3.3 IDE-Startbildschirm

Mehr

Handbuch für Redakteure

Handbuch für Redakteure Handbuch für Redakteure Erste Schritte... 1 Artikel erstellen... 2 Artikelinhalt bearbeiten... 3 Artikel bearbeiten... 3 Grunddaten ändern... 5 Weitere Artikeleigenschaften... 5 Der WYSIWYG-Editor... 6

Mehr

Enigmail Konfiguration

Enigmail Konfiguration Enigmail Konfiguration 11.06.2006 Steffen.Teubner@Arcor.de Enigmail ist in der Grundkonfiguration so eingestellt, dass alles funktioniert ohne weitere Einstellungen vornehmen zu müssen. Für alle, die es

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Anleitung für Evident Seite 1 Anleitung für Evident-Anwender: Einbinden der MIZ-Dokumente in Evident. Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen? Zunächst müssen Sie entscheiden,

Mehr

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. Der Serienversand Was kann man mit der Maske Serienversand machen? 1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden. 2. Adressen auswählen,

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Testklausur Einführung in die Programmierung Probeklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList In

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1

Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 Kapitel 4 Die Datenbank Kuchenbestellung Seite 1 4 Die Datenbank Kuchenbestellung In diesem Kapitel werde ich die Theorie aus Kapitel 2 Die Datenbank Buchausleihe an Hand einer weiteren Datenbank Kuchenbestellung

Mehr

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken.

In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access. Die Grundlagen der Datenbanken. In diesem Thema lernen wir die Grundlagen der Datenbanken kennen und werden diese lernen einzusetzen. Access Die Grundlagen der Datenbanken kurspc15 Inhaltsverzeichnis Access... Fehler! Textmarke nicht

Mehr

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom 21.10.2013b AGROPLUS Buchhaltung Daten-Server und Sicherheitskopie Version vom 21.10.2013b 3a) Der Daten-Server Modus und der Tresor Der Daten-Server ist eine Betriebsart welche dem Nutzer eine grosse Flexibilität

Mehr

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten

Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten Stundenerfassung Version 1.8 Anleitung Arbeiten mit Replikaten 2008 netcadservice GmbH netcadservice GmbH Augustinerstraße 3 D-83395 Freilassing Dieses Programm ist urheberrechtlich geschützt. Eine Weitergabe

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12

Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12 Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Jederzeit Ordnung halten

Jederzeit Ordnung halten Kapitel Jederzeit Ordnung halten 6 auf Ihrem Mac In diesem Buch war bereits einige Male vom Finder die Rede. Dieses Kapitel wird sich nun ausführlich diesem so wichtigen Programm widmen. Sie werden das

Mehr

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster Es gibt in Excel unter anderem die so genannten Suchfunktionen / Matrixfunktionen Damit können Sie Werte innerhalb eines bestimmten Bereichs suchen. Als Beispiel möchte ich die Funktion Sverweis zeigen.

Mehr

1 topologisches Sortieren

1 topologisches Sortieren Wolfgang Hönig / Andreas Ecke WS 09/0 topologisches Sortieren. Überblick. Solange noch Knoten vorhanden: a) Suche Knoten v, zu dem keine Kante führt (Falls nicht vorhanden keine topologische Sortierung

Mehr

GITS Steckbriefe 1.9 - Tutorial

GITS Steckbriefe 1.9 - Tutorial Allgemeines Die Steckbriefkomponente basiert auf der CONTACTS XTD Komponente von Kurt Banfi, welche erheblich modifiziert bzw. angepasst wurde. Zuerst war nur eine kleine Änderung der Komponente für ein

Mehr

Aufklappelemente anlegen

Aufklappelemente anlegen Aufklappelemente anlegen Dieses Dokument beschreibt die grundsätzliche Erstellung der Aufklappelemente in der mittleren und rechten Spalte. Login Melden Sie sich an der jeweiligen Website an, in dem Sie

Mehr

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) 3.7 Erstellen einer Collage Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu]) Dann Größe des Dokuments festlegen beispielsweise A4 (weitere

Mehr

Speicher in der Cloud

Speicher in der Cloud Speicher in der Cloud Kostenbremse, Sicherheitsrisiko oder Basis für die unternehmensweite Kollaboration? von Cornelius Höchel-Winter 2013 ComConsult Research GmbH, Aachen 3 SYNCHRONISATION TEUFELSZEUG

Mehr

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG it4sport GmbH HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG Stand 10.07.2014 Version 2.0 1. INHALTSVERZEICHNIS 2. Abbildungsverzeichnis... 3 3. Dokumentenumfang... 4 4. Dokumente anzeigen... 5 4.1 Dokumente

Mehr

AUSBILDUNG eines OBEDIENCE HUNDES

AUSBILDUNG eines OBEDIENCE HUNDES Beginners, CH (Box, Carré), 15 m entfernt Beginners, CH ab 2017 FCI - 1 (Box, Carré), 15 m entfernt mit Platz, 15 m FCI - 2 FCI - 3 mit Platz und Abrufen, 23 m Voransenden in einen Kreis, dann in ein Viereck

Mehr

Wie halte ich Ordnung auf meiner Festplatte?

Wie halte ich Ordnung auf meiner Festplatte? Wie halte ich Ordnung auf meiner Festplatte? Was hältst du von folgender Ordnung? Du hast zu Hause einen Schrank. Alles was dir im Wege ist, Zeitungen, Briefe, schmutzige Wäsche, Essensreste, Küchenabfälle,

Mehr

Gruppenrichtlinien und Softwareverteilung

Gruppenrichtlinien und Softwareverteilung Gruppenrichtlinien und Softwareverteilung Ergänzungen zur Musterlösung Bitte lesen Sie zuerst die gesamte Anleitung durch! Vorbemerkung: Die Begriffe OU (Organizational Unit) und Raum werden in der folgenden

Mehr

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich Mitgliederbereich (Version 1.0) Bitte loggen Sie sich in den Mitgliederbereich mit den Ihnen bekannten Zugangsdaten

Mehr

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:

Mehr

Der transparente Look. Die Struktur, die oben angegeben wurde, ist im Anwendungsdesigner, wie in der nächsten Grafik ersichtlich, abgebildet.

Der transparente Look. Die Struktur, die oben angegeben wurde, ist im Anwendungsdesigner, wie in der nächsten Grafik ersichtlich, abgebildet. Intrapact Layout Allgemeines Das Layout einer Firma wird im Intrapact Manager, und dort im Layout Designer erstellt. Alle Eingaben im Layout Designer dienen dazu um die CSS/ASP Dateien zu generieren, die

Mehr

Flash Videos einbinden

Flash Videos einbinden Flash Videos einbinden Im Kapitel Videos einbinden ( - ) haben Sie gesehen, wie man einfach und ohne Zusatzprogramme kleine Videoclips auf seiner einbinden kann. Ich persönlich würde jedem dieses Verfahren

Mehr

Hilfe Bearbeitung von Rahmenleistungsverzeichnissen

Hilfe Bearbeitung von Rahmenleistungsverzeichnissen Hilfe Bearbeitung von Rahmenleistungsverzeichnissen Allgemeine Hinweise Inhaltsverzeichnis 1 Allgemeine Hinweise... 3 1.1 Grundlagen...3 1.2 Erstellen und Bearbeiten eines Rahmen-Leistungsverzeichnisses...

Mehr

Bereich METIS (Texte im Internet) Zählmarkenrecherche

Bereich METIS (Texte im Internet) Zählmarkenrecherche Bereich METIS (Texte im Internet) Zählmarkenrecherche Über die Zählmarkenrecherche kann man nach der Eingabe des Privaten Identifikationscodes einer bestimmten Zählmarke, 1. Informationen zu dieser Zählmarke

Mehr

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann. Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann. Einleitung Es kommt vor, dass im Handel Disketten angeboten werden, die Styles und Registrationen

Mehr

Leichte-Sprache-Bilder

Leichte-Sprache-Bilder Leichte-Sprache-Bilder Reinhild Kassing Information - So geht es 1. Bilder gucken 2. anmelden für Probe-Bilder 3. Bilder bestellen 4. Rechnung bezahlen 5. Bilder runterladen 6. neue Bilder vorschlagen

Mehr

PowerPoint: Text. Text

PowerPoint: Text. Text PowerPoint: Anders als in einem verarbeitungsprogramm steht in PowerPoint der Cursor nicht automatisch links oben auf einem Blatt in der ersten Zeile und wartet auf eingabe. kann hier vielmehr frei über

Mehr

State Machine Workflow mit InfoPath Formularen für SharePoint 2010 Teil 6

State Machine Workflow mit InfoPath Formularen für SharePoint 2010 Teil 6 State Machine Workflow mit InfoPath Formularen für SharePoint 2010 Teil 6 Abstract: Im sechsten Teil der Workflow Serie verbinden wir die Formulare aus dem vorigen Teil mit unserem Workflow. Teil 6: InfoPath

Mehr

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen

Menü Macro. WinIBW2-Macros unter Windows7? Macros aufnehmen Menü Macro WinIBW2-Macros unter Windows7?... 1 Macros aufnehmen... 1 Menübefehle und Schaltflächen in Macros verwenden... 4 Macros bearbeiten... 4 Macros löschen... 5 Macro-Dateien... 5 Macros importieren...

Mehr

Kulturelle Evolution 12

Kulturelle Evolution 12 3.3 Kulturelle Evolution Kulturelle Evolution Kulturelle Evolution 12 Seit die Menschen Erfindungen machen wie z.b. das Rad oder den Pflug, haben sie sich im Körperbau kaum mehr verändert. Dafür war einfach

Mehr

Viele Bilder auf der FA-Homepage

Viele Bilder auf der FA-Homepage Viele Bilder auf der FA-Homepage Standardmäßig lassen sich auf einer FA-Homepage nur 2 Bilder mit zugehörigem Text unterbringen. Sollen es mehr Bilder sein, muss man diese als von einer im Internet

Mehr

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung

AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung AutoCAD 2007 - Dienstprogramm zur Lizenzübertragung Problem: Um AutoCAD abwechselnd auf mehreren Rechnern einsetzen zu können konnte man bis AutoCAD 2000 einfach den Dongle umstecken. Seit AutoCAD 2000i

Mehr

Einführung in Javadoc

Einführung in Javadoc Einführung in Javadoc Johannes Rinn http://java.sun.com/j2se/javadoc Was ist Javadoc? Javadoc ist ein Werkzeug, dass eine standardisierte Dokumentation für die Programmiersprache Java unterstützt. Vorteil:

Mehr

Kurzübericht der implementierten Funktionen der Fachinformatiker -== Info Datenbank ==-

Kurzübericht der implementierten Funktionen der Fachinformatiker -== Info Datenbank ==- Kurzübericht der implementierten Funktionen der Fachinformatiker -== Info Datenbank ==- Einleitung : Zu Beginn möchte ich kurz den Sinn dieser Datenbank erläutern. Als Webmaster der Fachinformatiker -==

Mehr

Wir arbeiten mit Zufallszahlen

Wir arbeiten mit Zufallszahlen Abb. 1: Bei Kartenspielen müssen zu Beginn die Karten zufällig ausgeteilt werden. Wir arbeiten mit Zufallszahlen Jedesmal wenn ein neues Patience-Spiel gestartet wird, muss das Computerprogramm die Karten

Mehr

ecaros2 - Accountmanager

ecaros2 - Accountmanager ecaros2 - Accountmanager procar informatik AG 1 Stand: FS 09/2012 Inhaltsverzeichnis 1 Aufruf des ecaros2-accountmanager...3 2 Bedienung Accountmanager...4 procar informatik AG 2 Stand: FS 09/2012 1 Aufruf

Mehr

Welche Gedanken wir uns für die Erstellung einer Präsentation machen, sollen Ihnen die folgende Folien zeigen.

Welche Gedanken wir uns für die Erstellung einer Präsentation machen, sollen Ihnen die folgende Folien zeigen. Wir wollen mit Ihnen Ihren Auftritt gestalten Steil-Vorlage ist ein österreichisches Start-up mit mehr als zehn Jahren Erfahrung in IT und Kommunikation. Unser Ziel ist, dass jede einzelne Mitarbeiterin

Mehr

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

14.4.2016. Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt 14.4.2016 Technische Hochschule Georg Agricola WORKSHOP TEIL 3 IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt Inhaltsverzeichnis 1. Kurzfassung zur Projekterstellung... 2 2. Morse-Tabelle...

Mehr

Verschlüsseln von Dateien mit Hilfe einer TCOS-Smartcard per Truecrypt. T-Systems International GmbH. Version 1.0 Stand 29.06.11

Verschlüsseln von Dateien mit Hilfe einer TCOS-Smartcard per Truecrypt. T-Systems International GmbH. Version 1.0 Stand 29.06.11 Verschlüsseln von Dateien mit Hilfe einer TCOS-Smartcard per Truecrypt T-Systems International GmbH Version 1.0 Stand 29.06.11 Impressum Herausgeber T-Systems International GmbH Untere Industriestraße

Mehr

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien

Bedienungsanleitung: Onlineverifizierung von qualifiziert signierten PDF-Dateien Sie haben von der VR DISKONTBANK GmbH ein signiertes PDF-Dokument (i.d.r. eine Zentralregulierungsliste mit dem Status einer offiziellen Rechnung) erhalten und möchten nun die Signatur verifizieren, um

Mehr

GEONET Anleitung für Web-Autoren

GEONET Anleitung für Web-Autoren GEONET Anleitung für Web-Autoren Alfred Wassermann Universität Bayreuth Alfred.Wassermann@uni-bayreuth.de 5. Mai 1999 Inhaltsverzeichnis 1 Technische Voraussetzungen 1 2 JAVA-Programme in HTML-Seiten verwenden

Mehr

Gleichungen Lösen. Ein graphischer Blick auf Gleichungen

Gleichungen Lösen. Ein graphischer Blick auf Gleichungen Gleichungen Lösen Was bedeutet es, eine Gleichung zu lösen? Was ist überhaupt eine Gleichung? Eine Gleichung ist, grundsätzlich eine Aussage über zwei mathematische Terme, dass sie gleich sind. Ein Term

Mehr

Textgestaltung mit dem Editor TinyMCE Schritt für Schritt

Textgestaltung mit dem Editor TinyMCE Schritt für Schritt Textgestaltung mit dem Editor TinyMCE Schritt für Schritt Folgender Artikel soll veröffentlicht und mit dem Editor TinyMCE gestaltet werden: Eine große Überschrift Ein Foto Hier kommt viel Text. Hier kommt

Mehr

Import und Export von Übergängern

Import und Export von Übergängern Import und Export von Übergängern SibankPLUS bietet Ihnen eine komfortable Schnittstelle, um den Wechsel der Schüler nach der Stufe 4 von der Grundschule auf eine weiterführende Schule zu verarbeiten.

Mehr

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003

Nicht kopieren. Der neue Report von: Stefan Ploberger. 1. Ausgabe 2003 Nicht kopieren Der neue Report von: Stefan Ploberger 1. Ausgabe 2003 Herausgeber: Verlag Ploberger & Partner 2003 by: Stefan Ploberger Verlag Ploberger & Partner, Postfach 11 46, D-82065 Baierbrunn Tel.

Mehr

Mandant in den einzelnen Anwendungen löschen

Mandant in den einzelnen Anwendungen löschen Mandant in den einzelnen Anwendungen löschen Bereich: ALLGEMEIN - Info für Anwender Nr. 6056 Inhaltsverzeichnis 1. Allgemein 2. FIBU/ANLAG/ZAHLUNG/BILANZ/LOHN/BELEGTRANSFER 3. DMS 4. STEUERN 5. FRISTEN

Mehr

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten

Access [basics] Rechnen in Berichten. Beispieldatenbank. Datensatzweise berechnen. Berechnung im Textfeld. Reporting in Berichten Rechnen in Berichten Berichte bieten die gleichen Möglichkeit zur Berechnung von Werten wie Formulare und noch einige mehr. Im Gegensatz zu Formularen bieten Berichte die Möglichkeit, eine laufende Summe zu bilden oder Berechnungen

Mehr

Format- oder Stilvorlagen

Format- oder Stilvorlagen Vorraussetzung Sie sollten Grundkenntnisse der HTML-Sprache besitzen, um die Ausbildungseinheit Formatvorlagen, auch Stilvorlagen genannt, ohne Probleme verstehen zu können. Ist dies nicht der Fall, empfehlen

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Universität der Bundeswehr Fakultät für Informatik Institut 2 Priv.-Doz. Dr. Lothar Schmitz FT 2006 Zusatzaufgaben Lösungsvorschlag Objektorientierte Programmierung Lösung 22 (Java und UML-Klassendiagramm)

Mehr

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel

Serienbrieferstellung in Word mit Kunden-Datenimport aus Excel Sehr vielen Mitarbeitern fällt es schwer, Serienbriefe an Kunden zu verschicken, wenn sie die Serienbrieffunktion von Word nicht beherrschen. Wenn die Kunden mit Excel verwaltet werden, genügen nur ein

Mehr

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN 184.705 2. 12. 2013 Kennnr. Matrikelnr. Familienname Vorname

Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN 184.705 2. 12. 2013 Kennnr. Matrikelnr. Familienname Vorname Gruppe A PRÜFUNG AUS SEMISTRUKTURIERTE DATEN 184.705 2. 12. 2013 Kennnr. Matrikelnr. Familienname Vorname Arbeitszeit: 100 Minuten. Aufgaben sind auf den Angabeblättern zu lösen; Zusatzblätter werden nicht

Mehr

Institut für Programmierung und Reaktive Systeme 26. April 2013. Programmieren II. 10. Übungsblatt

Institut für Programmierung und Reaktive Systeme 26. April 2013. Programmieren II. 10. Übungsblatt Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 26. April 2013 Programmieren II 10. Übungsblatt Hinweis: Insgesamt werden in diesem Semester fünf

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

Stand: 28.11.2012. Adressnummern ändern Modulbeschreibung

Stand: 28.11.2012. Adressnummern ändern Modulbeschreibung Seite 1 Inhalt Allgemein...3 Installation...3 manuelle Eingabe von alten und neuen Adressnummern...4 Vorbereiten von Adressnummern-Änderungen in Tabellen...5 Seite 2 Allgemein Das INKS-Modul ermöglicht

Mehr

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden.

Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden. Eine eigene Seite auf Facebook-Fanseiten einbinden und mit einem Tab verbinden. Nach den Änderungen die Facebook vorgenommen hat ist es einfacher und auch schwerer geworden eigene Seiten einzubinden und

Mehr

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen. Klicken Sie auf Neu anlegen, um Ihre neue Angebotseite zu erstellen..

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank

mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank mysql - Clients MySQL - Abfragen eine serverbasierenden Datenbank In den ersten beiden Abschnitten (rbanken1.pdf und rbanken2.pdf) haben wir uns mit am Ende mysql beschäftigt und kennengelernt, wie man

Mehr

Kreatives Gestalten mit Flash 5.0

Kreatives Gestalten mit Flash 5.0 Kreatives Gestalten mit Flash 5.0 Animationen, Effekte und Anwendungen für das WWW Bearbeitet von Isolde Kommer 1. Auflage 2000. Buch. 444 S. Hardcover ISBN 978 3 446 21463 7 Format (B x L): 20,1 x 23,6

Mehr

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang sysplus.ch outlook - mail-grundlagen Seite 1/8 Outlook Mail-Grundlagen Posteingang Es gibt verschiedene Möglichkeiten, um zum Posteingang zu gelangen. Man kann links im Outlook-Fenster auf die Schaltfläche

Mehr

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 Handbuch Fischertechnik-Einzelteiltabelle V3.7.3 von Markus Mack Stand: Samstag, 17. April 2004 Inhaltsverzeichnis 1. Systemvorraussetzungen...3 2. Installation und Start...3 3. Anpassen der Tabelle...3

Mehr

euro-bis Import von Bestellungen aus Buch- und Aboauskunft Stand 22.02.2007

euro-bis Import von Bestellungen aus Buch- und Aboauskunft Stand 22.02.2007 euro-bis Import von Bestellungen aus Buch- und Aboauskunft Stand 22.02.2007 INHALTSVERZEICHNIS Konfiguration... 3 Buch- und Aboauskunft... 3 euro-bis... 3 Aufträge einlesen... 5 Kundendaten prüfen... 6

Mehr

Erstellen der Barcode-Etiketten:

Erstellen der Barcode-Etiketten: Erstellen der Barcode-Etiketten: 1.) Zuerst muss die Schriftart Code-39-Logitogo installiert werden! Das ist eine einmalige Sache und muss nicht zu jeder Börse gemacht werden! Dazu speichert man zunächst

Mehr

Dokumentation. Serienbriefe mit Galileo-Daten im Word erstellen

Dokumentation. Serienbriefe mit Galileo-Daten im Word erstellen Dokumentation Serienbriefe mit Galileo-Daten im Word erstellen K:\Dokumentationen\Galileo bibwin Kunden Dokus\Kurz-Doku Seriendruck.doc 04.03.2008 1 Ablauf...2 2 Kundenadressen...3 3 Datenexport...4 3.1

Mehr

Dokumentation TELAU Post Mobile Billitem Converter

Dokumentation TELAU Post Mobile Billitem Converter Dokumentation TELAU Post Mobile Billitem Converter 2 Inhalt Ausgangslage... 3 Ziel... 3 Installation... 4 Monatlicher Ablauf... 5 Verarbeitung starten... 8 Rücknehmen von Definitionen... 11 3 Ausgangslage

Mehr

Die Entwicklung eines Glossars (oder eines kontrollierten Vokabulars) für ein Unternehmen geht üblicherweise in 3 Schritten vor sich:

Die Entwicklung eines Glossars (oder eines kontrollierten Vokabulars) für ein Unternehmen geht üblicherweise in 3 Schritten vor sich: Glossare 1 Inhalt 1 Inhalt... 1 2 Prozesse... 1 3 Eine kleine Zeittabelle...... 1 4 Die ersten Schritte... 2 5 Die nächsten Schritte...... 2 6 Die letzten Schritte... 3 7 Das Tool...... 4 8 Beispiele...

Mehr

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers

Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers Ist Excel das richtige Tool für FMEA? Steve Murphy, Marc Schaeffers Ist Excel das richtige Tool für FMEA? Einleitung Wenn in einem Unternehmen FMEA eingeführt wird, fangen die meisten sofort damit an,

Mehr

Im Original veränderbare Word-Dateien

Im Original veränderbare Word-Dateien Objekte einer Datenbank Microsoft Access Begriffe Wegen seines Bekanntheitsgrades und der großen Verbreitung auch in Schulen wird im Folgenden eingehend auf das Programm Access von Microsoft Bezug genommen.

Mehr

Handbuch für Redakteure

Handbuch für Redakteure Handbuch für Redakteure Erste Schritte... 1 Artikel erstellen... 2 Artikelinhalt bearbeiten... 3 Artikel bearbeiten... 3 Trennen der Druck- und der Online-Version.. 4 Grunddaten ändern... 5 Weitere Artikel-eigenschaften...

Mehr

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss Systeme 1 Kapitel 6 Nebenläufigkeit und wechselseitiger Ausschluss Threads Die Adressräume verschiedener Prozesse sind getrennt und geschützt gegen den Zugriff anderer Prozesse. Threads sind leichtgewichtige

Mehr

Schnelleinstieg. Datenimport für die EXPOSÉ - Familie. Import von Adress / Objektdaten aus MS Excel. = Datenintegration aus anderen Lösungen

Schnelleinstieg. Datenimport für die EXPOSÉ - Familie. Import von Adress / Objektdaten aus MS Excel. = Datenintegration aus anderen Lösungen Schnelleinstieg Datenimport für die EXPOSÉ - Familie Import von Adress / Objektdaten aus MS Excel = Datenintegration aus anderen Lösungen node Systemlösungen e.k. Kantstr. 149 10623 Berlin Tel: +49 30

Mehr

HTML5. Wie funktioniert HTML5? Tags: Attribute:

HTML5. Wie funktioniert HTML5? Tags: Attribute: HTML5 HTML bedeutet Hypertext Markup Language und liegt aktuell in der fünften Fassung, also HTML5 vor. HTML5 ist eine Auszeichnungssprache mit der Webseiten geschrieben werden. In HTML5 wird festgelegt,

Mehr