XML-File verabeiten

Status
Nicht offen für weitere Antworten.

mathon

Bekanntes Mitglied
hallo,


ich habe ein XML-File und möchte für dieses gerne mit Hilfe eines kleinen Java-Programms ein HTML-Output-File generieren, wo dann die einzelnen Daten des XML-Files in einer Tabelle dargestellt werden.

Hat jemand von euch Tipps für mich, wie ich das am einfachsten realisiere bzw. gibts vielleicht Tutorials oder Beispiele hierfür?

lg matti
 
R

Roar

Gast
ne am einfachsten geht das mit xsl
bd.gif
 

mathon

Bekanntes Mitglied
Hi,

danke für die replies, ja ich sollte es eigentlich mit JDom machen. Gibts dazu Tutorials oder SampleCode?

lg matti
 

mathon

Bekanntes Mitglied
Okay alles klar, nur wenn ich das XML-File eingelesen habe, gibt es da auch spezielle Methoden wie ich dann mit den Informationen aus dem XML-File ein Output-file erzeugen kann...?
 

mathon

Bekanntes Mitglied
Hmm...steh da jetzt noch ein bißchen an, bin in java zwar kein neuling, habe aber mit xml+java noch nichts gemacht. wie meinst du das genau mit dem XSLTransformer? - dafür brauch ich ja wieder ein eigenes package oder, das ist ja in dem jdom package von apache nicht dabei oder?
 
R

Roar

Gast
ne alder den brauch isch, bin isch doch voll der krasso checker pro nä
bd.gif


edit:
XSLTransformer ist von jdom
und jdom is nich von apache :D
 

mathon

Bekanntes Mitglied
Hi,


ups sorry, das läuft anscheinend nur unter der Apache-Lizenz. Okay,

1) Okay also wenn ich die Transformation mit einem XSL-Stylesheet mache erstelle ich mir einfach zu dem XML-File ein XSL-Stylesheet dazu und schreibe eine Java-Klasse die folgendes macht:


Code:
XSLTransformer t = new XSLTransformer("c:\books.xsl");
Document html = t.transform("c:\books.xsl"); 
new XMLOutputter().output(html, "c:\books.html");

Ist das so korrekt?

2) Ist es anders nicht möglich, wenn ich per JDom ein XML-File einlese, dass ich es in ein HTML-File rausschreibe, ohne ein XSL-File zu verwenden?


Wäre super wenn du mir nochmal antworten könntest. :?

lg matti
 
R

Roar

Gast
der code is nich so ganz korrekt, transform() erwartet dein XML Document, ansonsten schon glaub.

2) doch klar, aber is voll der noob aufwand mit string zusammenbatschen und voll :bloed: wenns doch dafür extra sowat krassomatisches wie xsl gibt
bd.gif
 

mathon

Bekanntes Mitglied
okay :), nur würde ich es gerne auf beide Arten durchführen...Wie könnte das nur beispielhaft aussehen, wenn ich ein XML-File ohne ein XSL-Stylesheet, formatiiert in eine HTML-Tabelle in ein HTML-Outputfile schreiben möchte?
 
R

Roar

Gast
kA wie deine xml datei aussieht aber dann irgendwie sowas eh:
sb.append("td").append(xmlElement.getAttributeValue("irgendwat").append("/td")...
und so nä
also ich würd dat lassen weil krampf und so
 

mathon

Bekanntes Mitglied
hmm...weiß jetzt nicht genau wie du das meinst...ich möchte ja dann die einzelnen Elemente des eingelesenen XML-Files in das HTML-Output-file schreiben bzw. die Elemente eben formatieren.

mein xml-file:

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE buecher SYSTEM "booking.dtd">
<buecher>
     <buch sprache="deutsch">
         <titel>Der Zerbrochene Krug</titel>
         <autor>Heinrich v. Kleist</autor>
         <preis>40</preis>
         <identifizierung id="a1"/>
     </buch>
   <buch sprache="deutsch">
         <titel>Der Talismann</titel>
         <autor>Johann Nestroy </autor>
         <preis>30</preis>
         <identifizierung id="a2"/>
   </buch>
   <buch sprache="englisch">
         <titel>Ein Kind</titel>
         <autor>Thomas Bernhard</autor>
         <preis>60</preis>
         <identifizierung id="a3"/>
   </buch>		
</buecher>

Ich würde damit gerne ein HTML-Ouput-file erstellen in dem eine HTML-Tabelle existiert, wo der Titel, Sprache, Autor, Preis die Spalten darstellen und die Daten die Zeilen.

Wie hast du das genau gemeint...? - sorry, dass ich nochmals nachfrage...

lg matti
 

huckfinn

Aktives Mitglied
Hi,

Im Prinzip läuft es darauf hinaus einen eigenen XML-Parser zu schreiben
und beim Auftreten eines Elementes und dessen Inhalte
entsprechenden HTML-code zu erzeugen.
Aber genau das macht das XSLT ja. Faktisch würdest du
das Fahrad noch mal erfinden. Aber was solls.

Für das Parsen kann man entweder einen Objektbaum
benutzen JDOM oder die Objekte zu Laufzeit behandeln,
das macht SAX. Ich bevorzuge SAX weil es den Speicher
relativ in Ruhe läßt. Um deine Anwendung zu implementieren,
mußt du einen SAX ContentHandler schreiben. Der implementiert
folgende Methoden.

Code:
package default;

import java.io.*;
import java.util.*;
import org.apache.commons.codec.binary.Base64;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.InputSource;

public class MyScanner implements ContentHandler {

    //--------------------------------------------------------------------------
     public MyScanner() {
        super();
        parser = new org.apache.xerces.parsers.SAXParser();
     }

    //--------------------------------------------------------------------------
   // Den Zugrif auf das Dokument schreibe ich schon mal rein
    public void parse(InputStream inputStream) throws SAXException {
        try {
            xmlStream = inputStream;
            parser.setFeature("http://xml.org/sax/features/validation",false);
            parser.setFeature("http://apache.org/xml/features/" +
                                  "nonvalidating/load-external-dtd",false);
            parser.setContentHandler(this);
            dataSource = new InputSource(xmlStream);
            parser.parse(dataSource);
        } catch (Exception e) {
           throw new SAXException("Kann den Datenstrom nicht öffnen! " +
                   "Details:"+e.getMessage());
        }  
    //--------------------------------------------------------------------------
    public void setDocumentLocator(Locator locator) {}

    //--------------------------------------------------------------------------
    public void startDocument() throws SAXException { ... alles initialisiern  }
    //--------------------------------------------------------------------------
    public void endDocument() throws SAXException { ... alles finales Zeug tun   }
    //--------------------------------------------------------------------------
    public void startPrefixMapping(String prefix, String uri)  throws SAXException {    }
    //--------------------------------------------------------------------------
    public void endPrefixMapping(String prefix) throws SAXException {    }
    //--------------------------------------------------------------------------
    public void startElement(String uri,  String localName, String qName, Attributes atts) throws SAXException { }
    //--------------------------------------------------------------------------
    public void characters(char[] ch, int start, int length) throws SAXException { }
    //--------------------------------------------------------------------------
    public void endElement(String uri, String localName, String qName) throws SAXException {  }
    //--------------------------------------------------------------------------
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {  }
    //--------------------------------------------------------------------------
    public void processingInstruction(String target, String data) throws SAXException {}
    //--------------------------------------------------------------------------
    public void skippedEntity(String name) throws SAXException {}
}

Das sieht viel aus ist es auch!. Wichtig für uns sind die Methoden

Code:
    public void startElement(..
    public void characters(char[] ch, int start, int length ...
    public void endElement(..

Also ein kleines Beispiel das sich an deinen xml Code anlehnt
..nur ein kleines Beispiel kann so aussehen. Ich gehe davon
aus das ich einen PrintWriter out habe um den Kram rauszuschreiben.

Code:
    //--------------------------------------------------------------------------
    public void startDocument() throws SAXException {
         out.println("<html><body>")
    }
    //--------------------------------------------------------------------------
    public void endDocument() throws SAXException { 
         out.println("</body></html>")
    }
    //--------------------------------------------------------------------------
    public void startElement(String uri,
            String localName,
            String qName,
            Attributes atts) throws SAXException {
            if (localName.equals("Buecher")) {
                out.println("<table>");
                out.println("<tr>");
                out.println("<th>Titel</th><th>Author</th><th>Preis</th><th>ID</th>");
                out.println("/<tr>");
           }   else if  (localName.equals("buch")) out.println("<tr>");           
           }   else if  (localName.equals("titel")) out.println("<td>");           
           }   else if  (localName.equals("author")) out.println("<td>");           
           }   else if  (localName.equals("preis")) out.println("<td>");           
           }   else if  (localName.equals("identifizierung")) {
                out.println("<td>");           
                out.println(atts.getValue("id"));
           }
     }
    //--------------------------------------------------------------------------
    public void characters(char[] ch, int start, int length) throws SAXException {
       out.print(new String(ch,start,length));
    }
    //--------------------------------------------------------------------------
    public void endElement(String uri,
            String localName,
            String qName) throws SAXException {
           // Geht auch einfacher ..was solls
           if (localName.equals("Buecher")) out.println("</table>");
           }   else if  (localName.equals("buch")) out.println("</tr>");           
           }   else if  (localName.equals("titel")) out.println("</td>");           
           }   else if  (localName.equals("author")) out.println("</td>");           
           }   else if  (localName.equals("preis")) out.println("</td>");           
           }   else if  (localName.equals("identifizierung")) out.println("</td>");           
     }

Wie du siehst ein ganz schönes Gemodder und wenn du was
umformatieren willst sehr unflexibel.

Als denne Huck


[/code]
 

mathon

Bekanntes Mitglied
Danke für diese ausführliche Antwort. Eine kleine Verständnisfrage noch:

Brauche ich die MyScanner-Klasse? - ich könnte doch einfach per printwriter die einzelnen elemente meines durch jdom eingelesenen trees rausschreiben oder?

lg matti
 

huckfinn

Aktives Mitglied
Hi,

Für SAX brauchst du die Implementierung MyScanner
da diese ja nur ein Interface mit abstrakten Methoden
weiter gibt. Du mußt ja formulieren was du bei dem
jeweilgen Ereignis "öffnen eines neuen Elementes"
"schließen eines offenen Elementes " während des
parsens tun willst .

Bei JDOM wird der Dokumentenbaum ja erzeugt
geparst und in einer Struktur abgespeichert. Diese
kannst du dann rekusiv durchlaufen, festellen welche
Knotentyp du hast und dann mit den jeweiligen
out.println Anweisungen deinen HTML-Code
erzeugen.

Noch eine Bemerkung. Das ablegen des Dokumentes
oder besser der gesamten Dokumentenstruktur ist sehr
speicherintensiv. Bei großen Dateien geht Java aber
auch andere Implementierung wie in Delphi schnell
in die Knie. SAX hingegen hat nur das momentanne
Kontenpaar + evt den PCDATA Block im Speicher.
Aber das hatte ich ja schon geschrieben.

Bis denne Huck
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JAXB und java.nio.file.Path XML & JSON 4
Trèfle Formatierung v. JSON File XML & JSON 7
L login - Java IOException jaas.config File or Directory not present XML & JSON 1
G Probleme mit Jsoup in .jar File XML & JSON 11
K JAR-File mit XML-Datei XML & JSON 1
JBoby Yaml File lesen und in Objekte umwandel (SnakeYAML / YamlBeans) XML & JSON 0
O XML Zugriff auf Entity File XML & JSON 0
B xsd-Datei ins jar file XML & JSON 5
S XLSX-File NoSuchMethodError XML & JSON 7
M SEPA XML file XML & JSON 11
S Xml File für den Aufbau einer anderen Xml Datei XML & JSON 6
S XML file lässt sich in Eclipse nicht erstellen XML & JSON 2
M <root> node in bestehendes XML-File XML & JSON 8
jstei001 .xsd File wärend der Laufzeit einlesen und XMl rausschreiben XML & JSON 5
L Datenstruktur in XML-File schreiben XML & JSON 2
Q XML-File als Objekt in Java XML & JSON 6
G DXF-File schreiben XML & JSON 17
GUI-Programmer java.io.File aus .jar beziehen XML & JSON 6
B XML file erstellen und in lesbarer form speichern XML & JSON 2
M XML File generieren XML & JSON 3
S Aus XML-File eine Baumstruktur erzeugen XML & JSON 5
N XML File aus Internet korrekt mit absätzen formatiert abspeichern XML & JSON 10
J xmlParser/-Writer: DTD in seperates File auslagern XML & JSON 4
C Xml file gegen eine DTD validieren XML & JSON 3
G Problem beim schreiben von XML in eine File XML & JSON 2
S Premature end of file XML & JSON 7
T File öffnen XML & JSON 6
B XML file für schtasks XML & JSON 5
G Simples XML File einlesen mit JDom. Prefix not bound ? XML & JSON 2
G Xml File schematisch auslesen XML & JSON 2
J File objekt in xml speichern? XML & JSON 12
G XMLEncoder: discarding statement LinkedList.add(File) XML & JSON 16
X XML File auslesen/parsen u. in ne Hashmap speichern XML & JSON 2
M Unhierarchisches XML-File mit DOM-Parser auswerten XML & JSON 5
M XML File während Applet-Start auslesen? XML & JSON 10
X Einzelne Tags rausnehmen aus einem großen XML-file XML & JSON 4
E XOM setzen von XML-Schema declaration beim erzeugen XML-File XML & JSON 2
M XSL-File für Transformation verwenden XML & JSON 3
A XML-File auslesen, alles leer? XML & JSON 2
S Geändertes XML-File wieder abspeichern. XML & JSON 10
D XML-file mit Eclipse erstellen + Namespaces XML & JSON 2
A html-File nach txt-File konvertieren XML & JSON 15
K XML to file geht nicht :( XML & JSON 4
A Internetinhalte auslesen und in einem XML-File speichern XML & JSON 4
T select-statement aus mysql in ein xml-file umwandeln XML & JSON 3
J XML File updaten XML & JSON 2
A XML-file an der Konsole ausgeben XML & JSON 4
D In ein XML File meinStyleSheet.css eintragen? XML & JSON 9
J Client für WebService programmieren (aus WSDL-File) XML & JSON 15
R wie kann ich ein xml file in einen string einlesen? XML & JSON 2
M *.group() in File auslesen XML & JSON 4
A XML-File ausgeben XML & JSON 2
W aus XML-File gelesenes als Methodenaufruf verwenden XML & JSON 5
T Elemente aus XML-File löschen (JDom) XML & JSON 9
T [JDOM] XML File, neue Daten hinzufügen XML & JSON 5
D Aus Java XML-File an PHP-Skript senden: Encodingproblem? XML & JSON 3
T Prob: Auslesen XML File mit JDOM XML & JSON 2
B DOM oder HTML File drucken "wie ein Browser es zeigen w XML & JSON 3

Ähnliche Java Themen

Neue Themen


Oben