XML-Parsing implementiert man normalerweise nicht selbst, sondern verwendet dafür fertige Bibliotheken. Goggle doch mal nach JDOM. Alternativ könntest DU auch (org.w3c.)DOM, SAX oder StAX verwenden.
XML-Parsing implementiert man normalerweise nicht selbst, sondern verwendet dafür fertige Bibliotheken. Goggle doch mal nach JDOM. Alternativ könntest DU auch (oirg.w3c.)DOM, SAX oder StAX verwenden.
Ja, ich habe schon ein paar Sachen zu SAX gefunden, aber ich komme damit leider gar nicht zurecht. Weißt du vielleicht ein Beispiel, von wo aus ich mein Vorhaben aus ableiten könnte?
jetzt haben wir ein Loopback, denn dein Link zeigt auf diesen hier
Aber dennoch danke für die Antwort.
Ich habe mir das auf galileocomputing.de durchgelesen, aber ich komme da leider nicht weiter. Vielleicht auch deswegen, weil in den Listings nicht der gesamte Code steht und ich das Buch nicht im Original habe.
Ich durchforste jetzt seit über 3 Stunden das web und finde einfach nichts, womit ich weiterkomme
Ich kenne mich leider einfach zu wenig aus um anhand dessen was bei galileocomputing.de steht, weiterzukommen.
Aber wenn du auf die Insel aufmerksam gemacht wurdest, dann hat der Link den sinn schon erfüllt. hier, in der zweiten Hälfte des vorletzten beitrages hab ich auch schon gestern was geschrieben. Mehr als die 3-4 befehle, die da aufgelistet sind, sind imho für's erste gar nicht nötig.
Und das was du bei galileo openbook findest ist schon komplett, dass ist jetzt keine "zensierte" version oder irgendsowas, was willst du denn in "ganzen listings" denn sehen? kilometerlange sich immer wiederholende import-anweisungen und "public static void main"? Dann wäre das buch statt anderthalb tausend eben fünf tausend seiten dick gewesen, und keiner wäre dadurch schlauer.
Lies dir das kapitel durch, was ich in dem anderen thread schon vorgeschlagen hab, also ich hab's damit recht schnell hinbekommen damals....
Vielleicht lag es daran, dass ich die ganze Zeit nach SAX gesucht habe und es damit umsetzen wollte.
Wenn DOM so viel einfacher ist, dann werde ich es einfach damit mal versuchen.
"SAX" steht schon für "Simple .." irgendwas mit xml, das ist für große Datenmengen besser / einzige Möglichkeit. JDOM find ich persönlich aber irgendwie intuitiver, für's erste.
Okay, mit DOM komme ich schon ein bisschen weiter.
Ich habe jetzt folgenden simplen Code:
Code:
public class XMLParser extends DefaultHandler
{
public static void main(String[] argv) throws JDOMException, IOException {
String filename = "result.srx";
Document doc = new SAXBuilder().build( filename );
//XMLOutputter out = new XMLOutputter( Format.getPrettyFormat() );
//out.output( doc, System.out );
Element root = doc.getRootElement();
Element results = root.getChild("result");
}
}
Damit greife ich vom Root-Element auf das Kind "result" zu.
Innerhalbb von result gibt es zwei Elemente die "binding" heißen und je unterschiedliche "name"-Attribute haben.
Wie kann ich z.B. nur auf name='clip' zugreifen (siehe mein XML-Doc im ersten Posting)?
Ich habe schon überlegt mit
Code:
List results = root.getChildren( "result" );
mir alle ausgeben zu lassen, was aber nicht klappt. Warum weiß ich nicht.
Muss ich eine Schleife basteln, um auf alle clips.uri und address.literal zuzugreifen und diese in einem array speichern zu können?
sorry, wenns so chaotisch ist, aber das ist alles super neu für mich.
maeck
getChildren leifert nur die unmittelbaren Kinder. Und da die result-Element unterhalb des results-Element liegen (und eben nicht direkt im root-Element) musses wohl so aussehen:
Code:
Element root = doc.getRootElement();
Element results = root.getChild("result");
List results = results.getChildren( "result" );
Muss ich mich denn immer an den Elementen entlanghangeln oder kann ich mit getChild("name") auf den Tag "name" zugreifen, auch wenn er weiter unten im Baum ist?
Mit
Code:
public class XMLParser extends DefaultHandler
{
public static void main(String[] argv) throws JDOMException, IOException {
String filename = "result.srx";
Document doc = new SAXBuilder().build( filename );
//XMLOutputter out = new XMLOutputter( Format.getPrettyFormat() );
//out.output( doc, System.out );
Element root = doc.getRootElement();
System.out.println("root: " + root.getName());
Element results = root.getChild("results");
System.out.println("results: " + results.getName());
}
}
bekomm ich immer eine NullPointerException in der Zeile 13.
Also ich habe jetzt rausbekommen, dass es wohl an dem ersten Tag "<sparql xmlns='http://www.w3.org/2005/sparql-results#'> " liegt, genauer gesagt an dem xmlns. Wenn ich das rausnehme, dann bekomm ich keine NullPointerException mehr.
Nur leider ist das Dokument so vorgegeben, was kann ich da also machen?
Element results = root.getChild("results", NS).getChild("result", NS);
auf die Elemente zugreifen.
Jetzt bleibt nur noch die Frage, wie ich die einzelnen "clip"-Elemente mit den dazugehörigen "address"-Elementen bekomme und sie anschließend in einem Array speichere.
Brauch ich dafür eine Schleife, oder wie mache ich das?
Jetzt bleibt nur noch die Frage, wie ich die einzelnen "clip"-Elemente mit den dazugehörigen "address"-Elementen bekomme und sie anschließend in einem Array speichere.
Brauch ich dafür eine Schleife, oder wie mache ich das?
vielen Dank für deine Mühen!
Ich bin in der Zwischenzeit auch schon weitergekommen und habe es so gemacht:
Code:
for(int i = 0; i < root.getChild("results", NS).getChildren().size(); i++) {
System.out.println("test" + i);
Element ele = (Element) root.getChild("results", NS).getChildren().get(i);
for(int j = 0; j < ele.getChildren().size(); j++) {
Element bind = (Element) ele.getChildren().get(j);
System.out.println(bind.getName());
String name = bind.getAttributeValue( "name");
if (name.equals("clip")) {
String uri = bind.getChild( "uri", NS).getText();
System.out.println("uri" + uri);
/* .. */
}else if (name.equals("address")) {
String literal = bind.getChild( "literal", NS).getText();
System.out.println("literal" + literal);
/* .. */
} else {
throw new RuntimeException( "unexpected name '" + name + "' in binding");
}
}
System.out.println(ele.getChildren().size());
}
Deine Art und Weisen der for-Schleifen-Deklarartion kenn ich nicht ... würde das auch so funktionieren wie du geschrieben hast?
Jetzt muss ich die Werte nur noch an der richtigen Stelle in ein mehrdimensionales Array packen, damit ich dann später damit arbeiten kann. Oder würdest du mir was anderes empfehlen?
Die ausgelesenen clips sollen nachher in einer SWT-List dargestellt werden. Wenn jemand auf einen Eintrag aus der Liste (also auf so einen Clip) draufklickt, soll dann die address (literal) an eine Funktion weitergegeben werden, die die Datei abspielt.
Deswegen dachte ich an ein mehrdimensionales Array in Form von
array[clip][address]
array[clip][address]
oder?
vielen Dank für deine Mühen!
Ich bin in der Zwischenzeit auch schon weitergekommen und habe es so gemacht:
Code:
for(int i = 0; i < root.getChild("results", NS).getChildren().size(); i++) {
System.out.println("test" + i);
Element ele = (Element) root.getChild("results", NS).getChildren().get(i);
for(int j = 0; j < ele.getChildren().size(); j++) {
Element bind = (Element) ele.getChildren().get(j);
System.out.println(bind.getName());
String name = bind.getAttributeValue( "name");
if (name.equals("clip")) {
String uri = bind.getChild( "uri", NS).getText();
System.out.println("uri" + uri);
}else if (name.equals("address")) {
String literal = bind.getChild( "literal", NS).getText();
System.out.println("literal" + literal);
} else {
throw new RuntimeException( "unexpected name '" + name + "' in binding");
}
}
}
Deine Art und Weisen der for-Schleifen-Deklarartion kenn ich nicht ... würde das auch so funktionieren wie du geschrieben hast?
Jetzt muss ich die Werte nur noch an der richtigen Stelle in ein mehrdimensionales Array packen, damit ich dann später damit arbeiten kann. Oder würdest du mir was anderes empfehlen?
Die ausgelesenen clips sollen nachher in einer SWT-List dargestellt werden. Wenn jemand auf einen Eintrag aus der Liste (also auf so einen Clip) draufklickt, soll dann die address (literal) an eine Funktion weitergegeben werden, die die Datei abspielt.
Deswegen dachte ich an ein mehrdimensionales Array in Form von
Jetzt muss ich die Werte nur noch an der richtigen Stelle in ein mehrdimensionales Array packen, damit ich dann später damit arbeiten kann. Oder würdest du mir was anderes empfehlen?
Ich hab leider noch nie einen eigenen Typ gebaut und weiß daher nicht, wie ich mit dem eigenen Typ dann ein eindimensionales Array bauen könnte und dann auf die Werte zugreifen kann?
Ich hab leider noch nie einen eigenen Typ gebaut und weiß daher nicht, wie ich mit dem eigenen Typ dann ein eindimensionales Array bauen könnte und dann auf die Werte zugreifen kann?
Der Code für den "eigenen Typ" ist doch von Murray gegeben. Un dein Array dieses Typs definierst du genauso wie ein Array eines x-beliebigen anderen Typs:
Ich hab leider noch nie einen eigenen Typ gebaut und weiß daher nicht, wie ich mit dem eigenen Typ dann ein eindimensionales Array bauen könnte und dann auf die Werte zugreifen kann?
Och bitte^^ Wenn du hier schon mit irgendwelchen XML-Parsern rumballern willst, solltest du doch wenigstens die einfachsten Grundlagen beherrschen. Dass du diese beherrschst wird automatisch angenommen, wenn du XML überhaupt erwähnst.
Wenn das alles nicht präsent ist, dann lies dir schleungst die ersten 9-10 Kapiteln aus der Insell durch und schreib einfach so ein paar dutzend von irgendwelchen Klassen, die irgendwas machen, leite ein wenig ab in alle richtungen, implementiere ein paar interfaces etc. Das muss sitzen. Bis es soweit ist, lässt du verarbeitung von XML besser sein, die überdurchschnittlich gruselige Hierarchie von diesen ganzen xml parsing-output-transformation-klassen eignet sich nicht so sonderlich gut als allererstes Beispiel.
List results = root.getChild("results", NS).getChildren("result", NS);
for ( Element result : results) {
List bindingLst = result.getChildren( "binding", NS);
int cnt = bindingLst.size() / 2; //--- zwei Elemente pro Binding
Binding[] bindingArray = new Binding[ cnt];
String uri = null;
String literal = null;
int idx = 0;
for ( Element binding : bindingLst) {
String name = binding.getAttributeValue( "name");
if ( name.equals( "clip")) {
uri = binding.getChild( "uri", NS).getText();
} else if ( name.equals( "address")) {
literal = binding.getChild( "iteral", NS).getText();
} else {
throw new RuntimeException( "unexpected name '" + name + "' in binding");
}
if ( (uri != null) && (literal != null)) {
bindingArray[idx++] = new Binding( uri, literal);
uri = null;
literal = null;
}
}
}
maeck hat gesagt.:
, aber wie kann ich dann auf die Daten zugreifen?
einfach mit bindingArray[0].getURI und bindingArray[0].getLiteral?