Announcement

Collapse
No announcement yet.

Java XML Parsing - Wie greift Parser auf Datei zu?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Java XML Parsing - Wie greift Parser auf Datei zu?

    Hallo!

    Bin ganz neu hier im Forum und fühle mich grade sehr hilflos.
    Habe seit Anfang der Woche angefangen, mit mich XML in Java zu beschäftigen, speziell mit DOM.

    Habe dafür zwei Quelltexte aus dem Buch "Java und XML", 2. Aufl. von Brett McLaughlin.
    Stelle die beiden Klassen hier mal ein:

    package javaxml2;

    import java.io.File;
    import org.w3c.dom.Document;

    //parser-Import
    import org.apache.xerces.parsers.DOMParser;

    public class SerializerTest{

    public void test(String xmlDocument, String outputFilename)
    throws Exception {
    File outputFile = new File(outputFilename);
    DOMParser parser = new DOMParser();

    // Den DOM-Baum als Dokument-Objekt erhalten
    //erst wird das Dokument geparst --> DOM-Baum
    parser.parse(xmlDocument);
    //dann muss der DOM-Baum noch angefordert werden:
    Document doc= parser.getDocument();

    //Serialisieren
    DOMSerializer serializer = new DOMSerializer();
    serializer.serialize(doc, outputFile);

    }

    public static void main(String[] args){
    if (args.length != 2){
    System.out.println("Verwendung: java javaxml2.SerializerTest "+ "[zu lesendes XML-DOkument] "+" [Name der Ausgabedatei]");
    System.exit(0);
    }

    try{
    SerializerTest tester = new SerializerTest();
    tester.test(args[0], args[1]);
    }catch (Exception e){
    e.printStackTrace();
    }
    }
    }

    package javaxml2;

    import java.io.*;
    import org.w3c.dom.*;

    public class DOMSerializer {

    /** Zu verwendende Einrückung*/
    private String indent;
    /** Zu verwendender Zeilentrenner */
    private String lineSeparator;

    public DOMSerializer(){
    indent="";
    lineSeparator = "\n";
    }

    public void setLineSeparator(String lineSeparator){
    this.lineSeparator = lineSeparator;
    }

    public void serialize(Document doc, OutputStream out)
    throws IOException {

    Writer writer = new OutputStreamWriter(out);
    serialize(doc, writer);

    }

    public void serialize(Document doc, File file)
    throws IOException {

    Writer writer = new FileWriter(file);
    serialize(doc, writer);

    }

    public void serialize(Document doc, Writer writer)
    throws IOException {

    // Dokument serialisieren
    // Serialisierungsrekursion ohne Einrücken starten
    serializeNode(doc, writer, "");
    writer.flush();
    }

    public void serializeNode(Node node, Writer writer, String indentLevel)
    throws IOException{
    switch(node.getNodeType()){
    case Node.DOCUMENT_NODE:
    writer.write("<?xml version=\"1.0\"?>");
    writer.write(lineSeparator);

    //Rekursion über alle Kindobjekte
    NodeList nodes = node.getChildNodes();
    if (nodes != null){
    for (int i=0; i<nodes.getLength(); i++){
    serializeNode(nodes.item(i), writer, "");
    }
    }
    /*
    Document doc = (Document)node;
    serializeNode (doc.getDocumentElement(), writer, "");
    */
    break;

    case Node.ELEMENT_NODE:
    String name = node.getNodeName();
    writer.write(indentLevel + "<" + name);
    //Atribut ausgeben
    NamedNodeMap attributes = node.getAttributes();
    for (int i=0; i<attributes.getLength(); i++){
    Node current = attributes.item(i);
    writer.write(" " + current.getNodeName()+ "=\"" + current.getNodeValue() + "\"");
    }
    writer.write(">");

    //Rekursion über jedes Kindobjekt
    NodeList children = node.getChildNodes();
    if (children != null){
    if ((children.item(0)!= null) &&
    (children.item(0).getNodeType()== Node.ELEMENT_NODE));{
    writer.write(lineSeparator);
    }
    for (int i=0; i<children.getLength(); i++){
    serializeNode(children.item(i), writer, indentLevel + indent);
    }
    if ((children.item(0) != null) && (children.item(children.getLength()-1) .getNodeType() == Node.ELEMENT_NODE)){
    writer.write(indentLevel);
    }
    }
    writer.write("</" + name + ">");
    writer.write(lineSeparator);
    break;

    case Node.CDATA_SECTION_NODE:
    writer.write("<![CDATA[" + node.getNodeValue() + "]]>");
    break;

    case Node.COMMENT_NODE:
    writer.write(indentLevel + "<!--" + node.getNodeValue() + "-->");
    writer.write(lineSeparator);
    break;

    case Node.PROCESSING_INSTRUCTION_NODE:
    writer.write("<?"+node.getNodeName()+ " " + node.getNodeValue() + "?>");
    writer.write(lineSeparator);
    break;

    case Node.ENTITY_REFERENCE_NODE:
    writer.write("&" + node.getNodeName() + ";");
    break;

    case Node.DOCUMENT_TYPE_NODE:
    DocumentType docType = (DocumentType)node;
    writer.write("<!DOCTYPE " + docType.getName());
    if (docType.getPublicId() != null){
    System.out.println(" PUBLIC \"" + docType.getPublicId() + "\" ");
    }else {
    writer.write(" SYSTEM ");
    }
    writer.write("\"" + docType.getSystemId() + "\">");
    writer.write(lineSeparator);
    break;

    case Node.TEXT_NODE:
    writer.write(node.getNodeValue());
    break;
    }
    }



    }
    Im Großen und Ganzen verstehe ich den Quelltext auch. Es ist mir z.B. klar, dass anscheinend in der Klasse SerializerTest die XML-Datei geparst wird.
    Nur verstehe ich jetzt nicht, woher der Parser weiß, welche Datei und woher er sie nehmen soll.
    Im Buch wird beschrieben, dass man den Dateipfad in die Argumente args[0] und args[1] übergeben soll.

    Doch hier ist schon mein nächsten Problem: wie funktioniert das?
    Anscheinend wird überall davon ausgegangen, dass man das shcon weiß, also geh ich davon aus, dass das ein sehr banales Problem ist.
    Aber ich habe wirklich überhaupt keine Ahnung, wie man solche zusätzlichen Argumente vor dem Kompilieren eingibt.

    Falls mir da irgendwer weiter helfen könnte, wäre ich wirklich höchst erfreut. Komme einfach nicht weiter und bei der Suche gebe ich wahrscheinlich die völlig falschen Begriffe ein, ich finde nämlich rein gar nichts!

    Vielen, vielen Dank für jede Antwort schon mal im Voraus!!

    LG Nadeshda

  • #2
    Einfach an den Java-Aufruf dran hängen

    Die Parameter werden der main-Methode über die Kommandozeile mitgegeben.
    Der Aufruf über Kommandozeile sieht ungefähr so aus:
    java javaxml2.SerializerTest "<PfadZuXmlDokument>" "PfadZuAusgabedatei".
    Wenn Du das Programm über Eclispe ausprobieren willst, gehst Du übers Menü Run->Run Configurations. Dort trägst Du im Reiter "Main" javaxml2.SerializerTest ein und im Reiter Arguments ins Feld Program Arguments die beiden Pfade.
    Alternativ kannst Du testhalber auch Stringkonstanden in die Klasse javaxml2.SerializerTest schreiben und auf die zugreifen anstatt auf args[].

    Gruß ngomo
    http://www.winfonet.eu

    Comment


    • #3
      Hey vielen, vielen Dank, du hast mir da sehr weiter geholfen =)
      Viele Grüße

      Comment

      Working...
      X