Auslesen einer (eigenartigen) XML-Datei

C

chemistry

Neues Mitglied
0
Hallo Leute,

ich habe mich eben hier registriert, da mir dieses Forum bereits bei anderen Fragen weitergeholfen hat und mir die Community zusagt.

Ich möchte auch direkt mit einer Frage starten, bei der mir sie übliche Google- und Foren-Suche bislang nicht weiterhelfen konnte.

Ich möchte für eine Android-App die aktuellsten Daten beim Initialisieren aus dem Internet laden und in eigene Objekte schreiben. Das wäre kein Problem, wäre der Aufbau der XML-Datei anders, aber ich bekomme sie nunmal so vom Server. Auf die Struktur der zu ladenden XML-Datei habe ich keinen Einfluss, da dies eine bereitgestellte Schnittstelle für mehrere Apps ist.

Vereinfacht sieht die XML-Datei so aus:

Code:
<array>
<dict>
<key>ID</key>
<string>1</string>
<key>Name</key>
<string>Irgendein Name</string>
<key>Datum</key>
<string>18.11.2010</string>
<key>Ort</key><string>Beispielhafter Ort</string><key>Uhrzeit</key><string>15:00 - 19:00</string>
</dict>
<dict>
<key>ID</key>
<string>2</string>
<key>Name</key>
<string>Irgendein Name 2</string>
<key>Datum</key>
<string>19.11.2010</string>
<key>Ort</key><string>Beispielhafter  Ort2</string><key>Uhrzeit</key><string>12:00 - 21:00</string>
</dict>
</array>
Ich hätte eigentlich folgenden Code vorgestellt, um z.B. an den Namen zu kommen, aber bei der aktuellen XML weiß ich nicht, wie ich das bewerkstelligen soll...

Code:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document doc = db.parse(in); // der InputStream aus'm Web
            doc.getDocumentElement().normalize();
            NodeList entries = doc.getElementsByTagName("dict");

            for (int s = 0; s < entries.getLength(); s++) {
                Node entry = entries.item(s);
                if (entry.getNodeType() == Node.ELEMENT_NODE) {
                    Element fstElmnt = (Element) entry;
                    NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("Name");
                    Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
                    NodeList fstNm = fstNmElmnt.getChildNodes();
                    String name = ((Node) fstNm.item(0)).getNodeValue();
                }
            }
Weiß von Euch jemand Rat, wie man an die verschiedenen Attribute in der gegebenen XML und an deren Werte kommen könnte, ohne einen Parser zu bauen? Letzteres ist ja nunmal nicht der Sinn von XML-Dateien...

Ich bin euch für Eure Antworten wirklich dankbar :)


Beste Grüße,

chemistry


*edit*
Ich habe es nun vorerst so gelöst, es ist aber keinesfalls eine Lösung, die mir besonders gut gefällt:
Code:
int id = Integer.parseInt(nodeList.item(0).getChildNodes().item(0).getNodeValue());
String name = nodeList.item(1).getChildNodes().item(0).getNodeValue();
String date = nodeList.item(2).getChildNodes().item(0).getNodeValue();
String location = nodeList.item(3).getChildNodes().item(0).getNodeValue();
 
Zuletzt bearbeitet:
1. Lass die Finger von DOM-Parser. Es ist nur für kleine dokumente tauglich
2. Nimm entweder SAX oder Pull-Parser
3. Benutze einen Databinding-Framework
 
Ich würde an der Stelle auch die Finger von einem DOM-Parser lassen, nicht wegen der Dokumentgrösse(ganz im Gegenteil, ich finde gerade dann DOM Parser unersetzlich) sondern vielmehr wegen der eigenartigen Dokumentstruktur - ich wüsste nciht wie man aus einem Baum lesen kann welcher Key zu welchem String gehört.

hier scheint SAX das mittel der Wahl zu sein - ohne konkretes codebeispiel hier meine Vorgehensweise:

Variablen deklarieren:
Code:
List<Map<String,String>> result = new LinkedList<Map<String,String>>();
String keyval[] = new String[2];
int i;
Map<String,String> tmp
Nun wirft der SAX Parser mehrere für dich relevante Events, wobei du verschiedene Aktionen durchführen musst (Funktionsname und Parameterliste der Events abhängig vom Parser).

startElement(String name):
Code:
if(name.equals("dict")) tmp = new HashMap<String,String>();
else if (name.equals("key")) i=0;
else if (name.equals("string")) i=1;
character(String text)
Code:
keyval[i]=text;
endElement(String name)
Code:
if(name.equals("dict")) result.add(tmp);
else if(name.equals("string")) tmp.put(keyval[0], keyval[1]);
Natürlich noch den Code formatieren und klammern wie es sich gehört :p (hab das eben nur aus der hohlen Hand in den Forumseditor runtergeschrieben)

Jedenfalls solltest du jetzt alle Daten vernünftig hinterlegt haben, um zB an alle Namen heranzukommen:
Code:
for(Map<String,String> data:result) {
  System.out.println("Name: "+data.get("Name"));
}

Ist jetzt doch etwas konkreter geworden und natürlcih nicht ausprobiert, viel Glück ;-)
 

Ähnliche Themen

H
Antworten
2
Aufrufe
1.309
Hcman
H
M
  • MikelKatzengreis
Antworten
5
Aufrufe
126
swa00
swa00
A
Antworten
10
Aufrufe
1.919
swa00
swa00
Zurück
Oben Unten