# Datenverlust nach sortieren (nur beim serialisieren)



## Vatar (29. Mrz 2005)

Nabend.

Also mein Problem ist folgendes: Ich möchte ein Element zu einem Knoten hinzufügen. Damit es mit der xsd übereinstimmt sollen nach dem Hinzufügen alle Elemente der ersten Ebene alphabetisch sortiert werden damit sie danach serialisiert werden können. Mein Problem besteht nur dann, wenn das neue Element nicht schon einmal vorhanden ist (man kann ja z.B.: mehrere Telefonnummern haben -> dann passt alles)

Ich benutze JDOM 

```
public void addNodeToElement(String id, Element newElement){
		Element parent = getElementByID(id);
		
		if(parent != null){
			int index = getIndexToPaste(parent, newElement);
			
			
		
			
			if(index != 0){
				/* Element an der Stelle einfügen an der schon Elemente mit gleichem Namen vorhanden sind */
				parent.addContent(index, newElement);
			}
			else{
				/* Element an das Ende des parents anfügen, da noch keines vorhanden */
				parent.addContent(newElement);
			}
			
			setModified(true);
			
			List children = parent.getChildren();

			Collections.sort( children, new XML_Element_Comparator() );

			parent.setContent(children);
			
			
		}
}// endmehtod




public void writeDocumentToFile(){
		if( isModified() ){
			XMLOutputter xmlOut = new XMLOutputter();
			try{
				xmlOut.output(document, new FileOutputStream(path));
			}catch(IOException io){
				io.printStackTrace();
			}
			setModified(false);
		}
		else
			System.out.println("[The Document wasn't modified -> Nothing Done]");
}// endmethod



public class XML_Element_Comparator implements Comparator {

	public int compare(Object o1, Object o2) {
		String a = ((Element)o1).getName();
		String b = ((Element)o2).getName();

		System.out.println(a.compareTo(b));
		return a.compareTo(b);
	}

}// end class
```

Wenn ich nach dem sortieren die neue Liste durchforste sind noch alle Attribute vorhanden. Serialisiere ich das Document, so sind *alle* Elemente leer.

ich hoffe ihr könnt mir helfen


----------



## Bleiglanz (30. Mrz 2005)

nimmst du zufällig JDOM? Dann schreib das bitte hin, keiner hat Lust sowas immer zu erraten

meinst du mit "serialisieren" den Aufruf deiner Methode writeDocumentToFile() ? oder was??



> Damit es mit der xsd übereinstimmt sollen nach dem Hinzufügen alle Elemente der ersten Ebene alphabetisch sortiert werden damit sie danach serialisiert werden können


Hä? Was? Seit wann kann man in einem Schema eine "alphabetische Reihenfolge" erzwingen? und was zum Teufel soll "serialisiert" bedeuten??



> Ich möchte ein Element zu einem Knoten hinzufügen
> 
> Wenn ich nach dem sortieren die neue Liste durchforste sind noch alle Attribute vorhanden.
> 
> Serialisiere ich das Document, so sind alle Elemente leer.


Na was jetzt: Attribute kaputt oder Elemente kaputt?? 


```
getElementByID(id);
```
Was ist das? eine member-Methode in deiner Klasse? Erzeugt die vielleicht versehentlich ein NEUES Element, das nicht mit dem document verknüpft ist??

dein Problem ist wahrscheinlich die "Live" Liste, kopier die lieber nach dem sortieren bevor du sie einhängst!!



> When all objects in the supplied List are legal and before the new content is added, all objects in the old content will have their parentage set to null (no parent) and the old content list will be cleared.


du fügst möglicherweise ein "leere" Liste mit setContent ein...


> this has the effect that any active list (previously obtained with a call to getContent() or getChildren()) will also change to reflect the new content. In addition, all objects in the supplied List will have their parentage set to this element, but the List itself will not be "live" and further removals and additions will have no effect on this elements content. If the user wants to continue working with a "live" list, then a call to setContent should be followed by a call to getContent() or getChildren() to obtain a "live" version of the content.


----------



## Vatar (30. Mrz 2005)

Ok dann etwas deutlicher. 

Ich nutze JDOM



> Hä? Was? Seit wann kann man in einem Schema eine "alphabetische Reihenfolge" erzwingen? und was zum Teufel soll "serialisiert" bedeuten??


Die Elemente des XMLs sollen alphabetisch sortiert werden (da es so in der XSD definiert ist). Mit Serialisiert meinte ich SPEICHERN AUF PLATTE



> Was ist das? eine member-Methode in deiner Klasse? Erzeugt die vielleicht versehentlich ein NEUES Element, das nicht mit dem document verknüpft ist??


Gibt lediglich das Element zurück, welches die übergebene ID besitzt. mehr nicht.



> du fügst möglicherweise ein "leere" Liste mit setContent ein...


Definitiv nicht. Das hab ich schon überprüft. Wenn ich die Liste durchgehe und mir die zugehörigen Attribute und angefügten Elemente ausgeben lasse ist alles vorhanden. Ich kann mir nur vorstellen dass er bei dem setContent nur die erste Ebene anfügt aber die tieferliegenden Elemente auslässt.



Ich hab gestern das erste mal was mit XML gemacht, dass man sich da mal falsch ausdrückt weil man noch nicht alles versteht kann schon mal vorkommen!!! also locker bleiben

trotzdem danke


----------



## Bleiglanz (30. Mrz 2005)

1. na toll, du hast noch immer dein Problem nicht beschrieben

2. Ist SPEICHERN AUF PLATTE = writeDocumentToFile()

3. Die Elemente des XMLs sollen alphabetisch sortiert werden (da es so in der XSD definiert ist): Heisst das, dass da eine sequence ist, die die erlaubten Elemente alphabetisch aufzählt? Komisch 

locker bleiben ist gut!



> Definitiv nicht. Das hab ich schon überprüft. Wenn ich die Liste durchgehe und mir die zugehörigen Attribute und angefügten Elemente ausgeben lasse ist alles vorhanden. Ich kann mir nur vorstellen dass er bei dem setContent nur die erste Ebene anfügt aber die tieferliegenden Elemente auslässt.


glaub ich nicht, natürlich kriegst du mit getChildren nur die erste Ebene, aber die tieferen sind ja in diesen Kindern mit drin

meine Vermutung


```
List children = parent.getChildren();
         // diese Liste ist LIVE, alles was mit der passiert, passiert
         // direkt mit den Elementen usw.

         /* probier mal  List children = new java.util.ArrayList(parent.getChildren()); an dieser Stelle */

         Collections.sort( children, new XML_Element_Comparator() );
         // möglicherweise schon das sort fatal

         parent.setContent(children); 
         // laut doku: all objects in the old content will have their 
         // parentage set to null (no parent) and the old content list 
         // will be cleared.
         // ABER DIE OLD CONTENT LIST ist ja gerade children???!!!
```

sort:


> This implementation dumps the specified list into an array, sorts the array, and iterates over the list resetting each element from the corresponding position in the array. This avoids the n2 log(n) performance that would result from attempting to sort a linked list in place.


was da wohl mit deiner LIVE liste passiert


----------



## Samson_Miller (28. Nov 2006)

--- sorry falscher Beitrag


----------

