ich weiss, das thema gibt es hier schon.
aber es lässt sich für mich irgendwie nicht lösen.
ich möchte eine xml datei erstellen, die bestimmte flags halten soll.
ich übergebe eine Auftragsnummer und das objekt flag, momentan nur gefüllt mit einer variablen "abgeschlossen" die den inhalt 0 oder 1 haben kann.
Funktionen:
(1) Wenn die flag datei nicht existiert, erstelle eine neue mit dem notwendigen inhalt (FUNKTIONIERT)
(2) wenn die datei bereits existiert, suche den entsprechenden tag und verändere den eintrag.
(3) wenn die datei bereits existiert, suche den entsprechenden tag, wenn er nicht existiert lege ihn neu an.
Punkt 2 bis 3 kriege ich einfach nicht hin.
Mir ist der letzte schritt, nach dem verändern in Methode 2, nicht klar, was ich im anschluss speichern muss, damit die daten nur verändert werden, alles existierende aber noch bestehen bleibt.
bisher konnte ich nach einigem ausprobieren, immer nur alles neu schreiben.
so wie der code ist, wirft er eine exception, wenn ich den code verändern will:
Exception in thread "main" org.jdom.IllegalAddException: The element "root" could not be added as the root of the document: The Content already has an existing parent document
wenn ich ihn komplett neu schreibe, funktioniert er wunderbar.
der fehler liegt in zeile 19 in methode 1, weil er root schreiben will.
root existiert aber bereits. was kann ich also sonst schreiben?
current aus methode 2, mein aktuelles tag, habe ich bereits versucht, da macht er einfach gar nichts.
ich hab keine ahnung mehr, nach 2 tagen seh ich den wald vor lauter bäumen nicht mehr.
Methode1 : Hier fängt alles an
Methode2 : Rekursive Suche nach dem tag
Methode3 : Speichern des XML
aber es lässt sich für mich irgendwie nicht lösen.
ich möchte eine xml datei erstellen, die bestimmte flags halten soll.
ich übergebe eine Auftragsnummer und das objekt flag, momentan nur gefüllt mit einer variablen "abgeschlossen" die den inhalt 0 oder 1 haben kann.
Funktionen:
(1) Wenn die flag datei nicht existiert, erstelle eine neue mit dem notwendigen inhalt (FUNKTIONIERT)
(2) wenn die datei bereits existiert, suche den entsprechenden tag und verändere den eintrag.
(3) wenn die datei bereits existiert, suche den entsprechenden tag, wenn er nicht existiert lege ihn neu an.
Punkt 2 bis 3 kriege ich einfach nicht hin.
Mir ist der letzte schritt, nach dem verändern in Methode 2, nicht klar, was ich im anschluss speichern muss, damit die daten nur verändert werden, alles existierende aber noch bestehen bleibt.
bisher konnte ich nach einigem ausprobieren, immer nur alles neu schreiben.
so wie der code ist, wirft er eine exception, wenn ich den code verändern will:
Exception in thread "main" org.jdom.IllegalAddException: The element "root" could not be added as the root of the document: The Content already has an existing parent document
wenn ich ihn komplett neu schreibe, funktioniert er wunderbar.
der fehler liegt in zeile 19 in methode 1, weil er root schreiben will.
root existiert aber bereits. was kann ich also sonst schreiben?
current aus methode 2, mein aktuelles tag, habe ich bereits versucht, da macht er einfach gar nichts.
ich hab keine ahnung mehr, nach 2 tagen seh ich den wald vor lauter bäumen nicht mehr.
Methode1 : Hier fängt alles an
Java:
public void loginPruefen( String auftragsNr, Flag flag ) {
Element flags = new Element( "flags" );
String datei = FCP_System.STAMMVERZEICHNIS + FCP_System.AUFTRAGSVERZEICHNIS + "/" + auftragsNr + "/flags.xml";
Element root = new Element( "root" );
SAXBuilder builder = new SAXBuilder();
// Wenn Datei bereits vorhanden, beginne Suche.
try {
Document doc = builder.build( datei );
root = doc.getRootElement();
loginPruefenSuche( root, auftragsNr, flag );
// ...wenn Datei noch nicht vorhanden.
} catch( Exception ex ) {
flags.addContent( new Element( "aid" ).addContent( auftragsNr ));
flags.addContent( new Element( flag.getAbgeschlossen( "name" ) ).addContent( flag.getAbgeschlossen( "value" ) ));
root.addContent( flags );
FCP_System.ordnerAnlegen( FCP_System.STAMMVERZEICHNIS + "/auftraege/" + auftragsNr );
}
Document dokument = new Document( root );
saveXML( datei, dokument );
System.out.println("speichern");
}
Methode2 : Rekursive Suche nach dem tag
Java:
private void loginPruefenSuche( Element current, String auftragsNr, Flag flag ) {
String datei = FCP_System.STAMMVERZEICHNIS + FCP_System.AUFTRAGSVERZEICHNIS + "/" + auftragsNr + "/flags.xml";
// Wenn tag gefunden...
if ( current.getName().equals( "abgeschlossen" ) ) {
// ...setze neuen Text.
current.setText( flag.getAbgeschlossen( "value" ) );
} else {
List children = current.getChildren();
Iterator iterator = children.iterator();
while ( iterator.hasNext() ) {
Element child = (Element) iterator.next();
loginPruefenSuche( child, auftragsNr, flag );
}
}
}
Methode3 : Speichern des XML
Java:
public void saveXML(String datei, Document document) {
try {
FileOutputStream fos = new FileOutputStream(datei, false);
XMLOutputter out = new XMLOutputter(Format.getPrettyFormat());
out.output(document, fos);
fos.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}