java xml sortieren

Thorus

Mitglied
Hi,

Ich moechte gerne ein xml-file auslesen, Nodes die auf derselben Ebene sind alphabetischen sortieren lassen, und dann das xml-file wieder schreiben...

Kann mir hierzu jemand ein link zu nem tutorial fuer einsteiger schicken, weil ich komme nicht so recht voran, kann JDOM das, oder sollte ich hierbei besser ein anderes API benutzen?

Ich hoffe ihr koennt mir helfen!!

Danke
Thorus
 

kirax

Bekanntes Mitglied
Mir fällt da spontan XML Binding ein (JAXB).
Damit kannst du die XML-Nodes wie Objekte handhaben und mit rumschaukeln.

Benötigt aber ein XSD, von daher bisschen aufwändiger.
 

Thorus

Mitglied
Mir würde die Möglichkeit einfallen Objekte zu sortieren mittels Collections.sort(Collection);

Also xml-Daten einlesen, sortieren, schreiben.

A la http://www.java-forum.org/xml-co/24161-root-getchildren-liste-sortieren-classcastexception.html

Hab mir das mal angeschaut und das ist glaube ich das was ich brauche, allerdings weiss ich nicht woher in der Klasse AngComparator das Objekt Element kommt, welches muss ich da importieren?

Danke schon mal fuer eure Hilfe
 

Thorus

Mitglied
Das mit dem Element habe ich jetzt hinbekommen (javax.swing.text.html.parser.Element) , allerdings habe ich jetzt ein aehnliches problem mit dem part:

Java:
    Document doc = getDocument(datei); 
    Element root = getRoot(doc); 
    AngComparator angComp = new AngComparator();
    ArrayList temp = new ArrayList(root.getChildren());
    Collection.sort(temp, angComp);
    root.removeChildren();
    root.setContent(temp);

In welchem Paket liegt das Objekt Document, und in welchem Format erwartet er die datei?

Selbes problem wie beim AngComparator auch hier wieder mit Element, javax.swing.text.html.parser.Element passt nicht weil er dann die angegeben Methoden nicht vorhanden sind....
 

timbeau

Gesperrter Benutzer
Falsche Paket, sorry ich dachte ich hätte schon geantwortet. Das ist alles in org.jdom

Java:
import org.jdom.Document;
import org.jdom.Element;
 

Thorus

Mitglied
Danke fuer deine Antwort :)

Wenn ich diesen beide einbinde bekomme ich folgende Fehlermeldungen:

Methode getDocument(FileReader) nicht vorhanden,
Methode getRoot(Document) nicht vorhanden,
Fehlendes Argument fuer removeChildren() (String oder String,Namespace)

Muss ich bei removeChildren das erste Child eintragen sodass quasi alles geloescht wird, damit dass sortierte xml eingetragen werden kann?

Kannst du mir hierbei helfen?
 

timbeau

Gesperrter Benutzer
Ich weiß ja nicht wo du deinen Code da oben her hast aber "getDocument(Datei)" lässt auf eine Methode schließen die irgendwo stehen müsste in deiner Java-Klasse.

Allgemeint erhälst du Documente aus bestehenden Dateien z.B. so:

Java:
SAXBuilder builder = new SAXBuilder();
			Document doc = builder.build(new File(destinationXMLfile));

wobei "destinationXMLfile" der Pfad zu deiner Datei ist.

Ein bestehendes Document kann man so schreiben:

Java:
public void writeFile(Document doc, String filename) throws IOException {
        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        FileOutputStream output = new FileOutputStream(filename);
        outputter.output(doc, output);

    }

edit: Bzgl der Children musst du wie er sagt den Bezeichner der zu löschenden Kinder angeben.

p.s.: Es ist schwer zu raten, was du genau machen willst.
 
Zuletzt bearbeitet:

Thorus

Mitglied
Machen moechte ich, ein komplettes XML-File einlesen dieses alphabetisch sortieren, und danach wieder in die Datei schreiben, ohne dabei natuerlich den Sinn des XML-Files zu veraendern, sprich die Elemente sollen auf derselben Ebene bleiben aber alphabetisch sortiert werden, ich hoffe es ist verstaendlich was ich meine?

edit: Den Code habe ich aus dem Beispiel auf das du mich hingewiesen hast...
 
Zuletzt bearbeitet:

timbeau

Gesperrter Benutzer
Okay, ja dann sollte das ja helfen. Ansonsten gibts bei thorsten horn einiges. Mal googlen nach jdom bringt viele Beispiele.
 

Thorus

Mitglied
Hab mich jetzt mit JDOM und XML beschaeftigt, und bin jetzt soweit dass das xml-file eingelesen wird, DOM kenn ich gluecklicherweise schon von HTML und habe damit keine probleme, allerdings funktioniert das sortieren nicht!
Java:
			        SAXBuilder builder1 = new SAXBuilder();
		            Document doc1 = null;
					try {
						doc1 = builder1.build(textXML1.getText());
					} catch (JDOMException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
			        Element root1 = doc1.getRootElement();
			        AngComparator angComp1 = new AngComparator();
			        ArrayList temp1 = new ArrayList(root1.getChildren());
			        Collections.sort(temp1, angComp1);
			        root1.removeContent();
			        root1.setContent(temp1);
			        XMLOutputter out1 = new XMLOutputter();
			        try {
						FileOutputStream output1 = new FileOutputStream(textXML1.getText());
						out1.output(doc1,output1);
					} catch (FileNotFoundException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					} catch (IOException e2) {
						// TODO Auto-generated catch block
						e2.printStackTrace();
					}

In diesem Abschnitt wird der Pfad aus einem Textfeld der GUI genommen das XML-File eingelesen, dann mit dem AngComparator sortiert ( was nicht richtig funktioniert ), und danach wieder in das file geschrieben wird.

Hier noch der AngComparator:

Java:
import java.util.Comparator;
import org.jdom.Element;



public class AngComparator implements Comparator {
	
	public int compare(Object arg0, Object arg1) {
		int result = 0;
		Element elm0 = (Element) arg0;
		Element elm1 = (Element) arg1;
		String feld0 = elm0.getAttribute("name").getValue();
		String feld1 = elm1.getAttribute("name").getValue();
		
		result = feld0.compareTo(feld1);

		return result;
	}
	
}

getestet habe ich das mit dem folgenden beispiel:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<root>
<buchstaben>
<a />
<d />
<b />
<c />
</buchstaben>
</root>
[/XML]

sortiert sollte dann ja eig. das rauskommen:

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<root><buchstaben>
<a />
<b />
<c />
<d />
</buchstaben></root>
[/XML]

Allerdings wird bei der Sortierung nichts veraendert...

Was mache ich falsch?? Habe dazu nichts gefunden bei google...
 

Bierhumpen

Bekanntes Mitglied
Zum einen hat dein root nur 1 Kindelement, also gibt's da nicht viel zu sortieren und zum zweiten hast du überhaupt gar keine name Attribute in deiner XML.
 

Niki

Top Contributor
Java:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class XMLSorter {

	private Comparator<Element> comp = new ElementComparator();

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		new XMLSorter().sortXML(new File("sort.xml"));

	}


	public void sortXML(File xml) throws IOException, JDOMException{
		SAXBuilder saxBuilder = new SAXBuilder();
		Document doc = saxBuilder.build(xml);
		Element root = doc.getRootElement();

		sort(root);

		XMLOutputter outputter = new XMLOutputter();
		FileOutputStream fos = new FileOutputStream(xml);
		outputter.output(doc, fos);
		fos.flush();
		fos.close();
	}

	@SuppressWarnings("unchecked")
	private void sort(Element e){
		List<Element> children = e.getChildren();
		if(children.isEmpty())
			return;

		for(Element child : children)
			sort(child);

		List<Element> tmp = new ArrayList<Element>(children);

		Collections.sort(tmp, comp);
		e.removeContent();
		e.addContent(tmp);
	}

	private static class ElementComparator implements Comparator<Element>{
		public int compare(Element o1, Element o2) {
			return o1.getName().compareTo(o2.getName());
		}
	}

}

das sollte genau das sein was du suchst
 
Zuletzt bearbeitet:

Thorus

Mitglied
Ja das ist fast genau das was ich brauche,

wenn ich das richtig sehe wird das auch hier ueber Collections.sort sortiert, oder?

denn bspw.:

[XML]
<b key="467">
467
</b>
<b key="367">
367
</b>
[/XML]

wird nicht nach

[XML]
<b key="367">
367
</b>
<b key="467">
467
</b>
[/XML]

sortiert, sondern in seiner Reihenfolge belassen, gibt es eine Moeglichkeit, Collections.sort anzupassen sodass sollten die Elemente denselben namen haben dass dann nach Attribut oder Content sortiert wird? (ich brauche eine eindeutige Reihenfolge)
 

Niki

Top Contributor
klar geht das. das hat aber nichts mit Collections.sort zu tun, sondern mit der compare Methode im Comparator:

Java:
		public int compare(Element o1, Element o2) {
			if(o1.getName().equals(o2.getName())){
				return o1.getText().compareTo(o2.getText());			}


			return o1.getName().compareTo(o2.getName());
		}
 

Thorus

Mitglied
Habe den Comparator jetzt meinen Beduerfnissen angepasst, allerdings bekomme ich jetzt immer eine NullPointerException

Java:
   private static class ElementComparator implements Comparator<Element>{
        public int compare(Element o1, Element o2) {
            if(o1.getName().equals(o2.getName())){
            	boolean hasConfigidChild = false;
            	try{
            		o1.getChild("ConfigID");
            		o2.getChild("ConfigID");
            		hasConfigidChild = true;
            	}
            	catch(NullPointerException e){
            		System.out.println(e);
            		hasConfigidChild = false;
            	}
            	
				if(hasConfigidChild){
						return o1.getChild("ConfigID").toString().compareTo(o2.getChild("ConfigID").toString());
                }
            }
 
            return o1.getName().compareTo(o2.getName());
        }
    }

Er soll, falls beide Elemente denselben Namen haben, schauen ob beide elemente ein Kind haben welches ConfigID heisst, und falls dass der Fall ist nach dem Content dieses Childs sortieren...

Allerdings bekomme ich eine NullPointerException bei "return o1.getChild("ConfigID").toString().compareTo(o2.getChild("ConfigID").toString());", aber eig sollte doch das try/catch diese abfangen oder nicht?
 

Niki

Top Contributor
probier mal
Java:
         public int compare(Element o1, Element o2) {
            if(o1.getName().equals(o2.getName())){
                 if(o1.getChild("ConfigID") != null && o2.getChild("ConfigID") != null){
                        return o1.getChild("ConfigID").toString().compareTo(o2.getChild("ConfigID").toString());
                }
            }
 
            return o1.getName().compareTo(o2.getName());
        }
 

Thorus

Mitglied
Ok das geht jetzt ohne NullPointerException, allerdings bekomme ich jetzt einen Fehler beim Starten den ich nicht kenne, und sortieren tut er folgendes XML auch nicht richtig (benutze ich zum testen):

[XML]
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a key="125">
125
</a>
<b key="567">
<ConfigID>
127
</ConfigID>
</b>
<b key="867">
<ConfigID>
67
</ConfigID>
</b>
<f key="135">
<baum>
gruen
</baum>
</f></root>

[/XML]

Wenn es richtig funktionieren wuerde sollte, er <b key="867"> vor <b key="567"> einordnen...

Der Fehler lautet:

java.lang.NoClassDefFoundError: com/sun/java/accessibility/util/TopLevelWindowListener
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.net.FactoryURLClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
 

Niki

Top Contributor
dann tausche toString() mit getValue() aus:

javadoc lesen hilft

Java:
if(o1.getName().equals(o2.getName())){
                if(o1.getChild("ConfigID") != null && o2.getChild("ConfigID") != null){
                       return o1.getChild("ConfigID").getValue().compareTo(o2.getChild("ConfigID").getValue());
               }
}
 

Thorus

Mitglied
Danke, habs jetzt mal mit javadoc probiert, allerdings ohne Erfolg, bei getValue, getText und getTextTrim sortiert er trotzdem nicht...

Java:
       public int compare(Element o1, Element o2) {
            if(o1.getName().equals(o2.getName())){
                 if(o1.getChild("ConfigID") != null && o2.getChild("ConfigID") != null){
                	 	System.out.println(o1.getChild("ConfigID").getTextTrim());
                	 	System.out.println(o2.getChild("ConfigID").getTextTrim());
                        return o1.getChild("ConfigID").getTextTrim().compareTo(o2.getChild("ConfigID").getTextTrim());
                }
            }
 
            return o1.getName().compareTo(o2.getName());
        }
    }
er gibt aber 67 und 127 korrekt aus, veraendert aber deren reihenfolge nicht....
 

Niki

Top Contributor
dann wandel den String in Integer um und vergleich diese

Java:
public int compare(Element o1, Element o2) {
            if(o1.getName().equals(o2.getName())){
                 if(o1.getChild("ConfigID") != null && o2.getChild("ConfigID") != null){
                        Integer i1 = new Integer(o1.getChild("ConfigID").getTextTrim());
                        Integer i2 = new Integer(o2.getChild("ConfigID").getTextTrim());
                        return i1.compareTo(i2);
                }
            }
 
            return o1.getName().compareTo(o2.getName());
        }
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
K Java sortieren. Java Basics - Anfänger-Themen 7
L Java Int-Array, Zahlen sortieren Java Basics - Anfänger-Themen 8
T Java: Array monat absteigend sortieren? Java Basics - Anfänger-Themen 1
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
J Klassen java.lang.String - lexikographisches Sortieren Java Basics - Anfänger-Themen 5
S Methoden Sortieren: java.util.Arrays.useLegacyMergeSort Java Basics - Anfänger-Themen 4
B Sortieren mit Java[ Java Basics - Anfänger-Themen 4
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben