XML-Daten mit SAX auslesen

Hallo,


<![CDATA[Heinrich & Müller GmbH]]>

Die Lösung ist wohl die beste.

Grundsätzlich habe ich den Eindruck, dass der SAXParser eh nicht so ganz sauber läuft.
Manchmal habe ich auch den Effekt wenn gar kein von den verbotenen Zeichen (< > & " ') im ganzen XML vorhanden ist, dass dann nur ein Teil des Wertes eingelesen wird.
Makiert man dann den Inhalt wie oben beschrieben geht es.

Also so wie ich SAX verstehe ist es doch so, dass es der Parserimplementierung hier überlassen wird, wie viele Zeichen in der characters-Routine mitgegeben wird. Hat vermutlich Performancegründe, die von Implementation zu Implementation verschieden gelöst sein kann. Alles was man da tun muss ist den String so lange sammeln bis das erwartete Ende (vermutlich durch einen Ende-Tag -Event gekennzeichnet) auftaucht.

Die anderen Lösungen wie z.B. JAXB sind mitunter vielleicht ganz bequem, aber siei verbratzen halt auch erheblich mehr resourcen, vor allem wenn es sich um sehr große Dateien handelt.
Ich glaube dass die Codierung der XML vielleicht Einfluß haben kann, aber eigetnlich sollte dass dennoch kein Hindernisgrund sein, da mit der richtigen Zeichensammelmimik sollte das bei allen Codierungen auch unabhängig vom Betriebssystem funktionieren.

Takidoso
 
Hallo
Ich habe eine Frage und zwar geht es darum, die ausgelesene Parameter in eine neue oder bereits exestierende XML Datei zu schreiben, ohne dabei irgendwas noch zu ändern, also nur die Attribute und Parameter zu ändern. Ich habe die Attribute und Parameter mit SAXPArser gelesen und in eine Map gespeichert:
Code:
import com.sun.org.apache.xerces.internal.parsers.SAXParser;
import java.util.HashMap;
import java.util.Map;
import org.xml.sax.AttributeList;
import org.xml.sax.DocumentHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;

public class XMLSaxParser implements DocumentHandler {
    
    private String ATTRIBUTE = "";
    private String VALUE = "";
    private static Map<String, String> map = new HashMap<String, String>();
    /** Konstruktor für Objekte der Klasse XMLSaxParser */
    public XMLSaxParser(String uri) {
        parse(uri);
    }
    
    private void parse(String file) {
        SAXParser parser = new SAXParser();
        parser.setDocumentHandler(this);
        try {
            parser.parse(file);
        } catch (Exception e) {
            System.err.println("Fehler beim Parsen");
            System.err.println(e);
        }
    }
    
    public void setDocumentLocator(Locator locator) {
    }
    
    public void startDocument() throws SAXException {
    }
    
    public void endDocument() throws SAXException {
    }
    
    public void startElement(String name, AttributeList attrs) throws SAXException {
        if (attrs != null) {
            int length = attrs.getLength();
            for (int i = 0; i < length; i++) {
//                System.out.println(attrs.getValue(i));
                setATTRIBUTE(attrs.getValue(i));
            }
        }
    }
    
    public void endElement(String name) throws SAXException {
    }
    
    public void characters(char[] ch, int start, int length) throws SAXException {
        String temp = new String(ch, start, length);
//        System.out.print(new String(ch, start, length));
        if (!temp.equals("")) {
            setVALUE(new String(ch, start, length));
            saveToMap(getATTRIBUTE(), getVALUE());
        }
    }
    
    
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
//        characters(ch, start, length);
    }
    
    public void processingInstruction(String target, String data) throws SAXException {
    }
    
    public String getATTRIBUTE() {
        return ATTRIBUTE;
    }
    
    public void setATTRIBUTE(String ATTRIBUTE) {
        this.ATTRIBUTE = ATTRIBUTE;
    }
    
    public String getVALUE() {
        return VALUE;
    }
    
    public void setVALUE(String VALUE) {
        this.VALUE = VALUE;
    }
    
    public void saveToMap(String element, String value) {
        map.put(element, value);
    }
    
    public Map<String, String> getMap() {
        return map;
    }

Beispiel von XML datei:
Code:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>
        <property name="Das ist Attribute">Das ist Wert</property>
        <property name="Das ist Attribute2">Das ist Wert2</property>
        u s.w.
    </session-factory>

</hibernate-configuration>
So, jetzt will ich z.B die Attribute und deren Werte ändern und speichern (in diese oder eine neue Datei) und das klap irgendwie nicht. Ich bitte um Hilfe.
 
Zuletzt bearbeitet:
Zurück