Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?
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?
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....
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?
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.
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...
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;
}
}
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.
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)
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());
}
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?
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):
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)