dom4j-Package, DOCTYPE+ELEMENT verwenden

schnuffie

Erfahrenes Mitglied
Hallo XML-Experten,

in einem unserer Projekte soll der Datenaustausch mit Drittsystemen über eine standardisierte XML-Schnittstelle erfolgen. Es müssen also bestimmte Regeln innerhalb der XML-Datei eingehalten werden.
Dazu wurde ein entsprechender Header eingesetzt (siehe Beispiel-XML-Datei). Der Content-Type ist "ISO-8859-1" und soll auch so bleiben (wegen ä, ö und ü).

Empfohlen wurde mit "dom4j", mit dem ich inzwischen auch recht gut (im Gröbsten) zurecht komme. Ich kann bereits diese XML-Datei und ihre Knoten lesen, und ein Document-Objekt als XML-Datei speichern. Die mitgelieferten Beispiele decken leider nicht das ab, was ich will. In der API fand ich bislang auch noch nicht das Richtige.

Soweit, so gut. Jetzt fehlt mir noch Folgendes:
- Änderungen in der bestehenden XML-Datei vornehmen
- Content-Type auf "ISO-8859-1" setzen (Standard ist nämlich UTF-8)
- vorhandenen DOCTYPE mit ELEMENT-Einträgen auswerten und respektieren
(kann derzeit alles reinschreiben = nicht Sinn der Sache :) )

Ein paar kleine Code-Schnipsel würden mir schon weiterhelfen.
Danke.
 

Anhänge

  • datenbank.zip
    696 Bytes · Aufrufe: 49
Hallo!

Schau mal hier:
Code:
/*
 * Created on 22.01.2005@21:27:16
 *
 * TODO Licence info
 */
package de.tutorials;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentType;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * @author Administrator
 *
 * TODO Explain me
 */
public class Dom4JUsageExample {

    public static void main(String[] args) {
        //Eingabedokument Validieren
        SAXReader reader = new SAXReader(true);
        try {
            Document doc = reader.read(new File("c:/contacts.xml"));

            DocumentType docType = doc.getDocType();
            
            //Elementdaten verändern.
            List list = doc.selectNodes("//Datensatz/Nachname");
            for (Iterator iter = list.iterator(); iter.hasNext();) {
                Node node = (Node)iter.next();
                node.setText(node.getText() + "_" + node.getText());
            }

            //Encoding ändern.
            XMLWriter writer = new XMLWriter(new FileWriter(new File(
                    "c:/contacts2.xml")), new OutputFormat(null, false,
                    "ISO-8859-1"));

            //Dokument auf Platte schreiben.
            writer.write(doc);
            writer.close();

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Hier meine contacts.xml:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Adressenliste SYSTEM "c:/Adressenliste.dtd">
<?xml-stylesheet href="datenbank.css" type="text/css"?>
<Adressenliste>
   <!-- Hier steht der Datensatz von Steffen -->
  <Datensatz>
   <Nachname>Nobis</Nachname>
   <Vorname>Steffen</Vorname>
   <Strasse>Otto-Röhm-Str. 71C</Strasse>
   <PLZ>64291</PLZ>
   <Ort>Darmstadt</Ort>
   <willi>
   	<Telefon>886-174</Telefon>
   </willi>
  </Datensatz>
  <!-- Hier steht der Datensatz von Egbert -->
  <Datensatz>
   <Nachname>Terlinde</Nachname>
   <Vorname>Egbert</Vorname>
   <Strasse>Otto-Röhm-Str. 71C</Strasse>
   <PLZ>64291</PLZ>
   <Ort>Darmstadt</Ort>
   <willi>
     <Telefon>886-388</Telefon>
     <background-picture>FOO</background-picture>
   </willi>
  </Datensatz>
</Adressenliste>

Hier meine AddressListe.dtd:
Code:
 <!ELEMENT Adressenliste (Datensatz*)>
 <!ELEMENT Datensatz (Nachname, Vorname, Strasse, PLZ, Ort, willi?)>
         <!ELEMENT Nachname (#PCDATA)>
         <!ELEMENT Vorname (#PCDATA)>
         <!ELEMENT Strasse (#PCDATA)>
         <!ELEMENT PLZ (#PCDATA)>
         <!ELEMENT Ort (#PCDATA)>
         <!ELEMENT background-picture ANY>
         <!ELEMENT Telefon (#PCDATA)>
         <!ELEMENT willi (Telefon, background-picture?)>
         <!-- Elemente:
            ? optionales Element, 1 oder mehrmal
            + erforderliches und wiederholbares Element, mindestens einmal
            * optionales und wiederholbares Element, beliebig
          -->

Habe dein XML Dokument ein wenig geändert, da meiner Meinung nach die XML Struktur das Dokument beschreiben sollte und nicht etwa noch zusätzlich eingestreute "Meta-Daten" -> "Uberschrift".

Weiterhin habe ich die DTD externalisiert was die Wiederverwendung erleichtert.

HTH,
Gruß Tom
 
Zurück