Bestimmtes XML Element auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bestimmtes XML Element auslesen

    Hallo allerseits,

    aktuell möchte ich eine XML parsen und die Daten in meine App einlesen, sprich während der Benutzung der App auf die Daten zugreifen.
    Das Parsen der ganzen XML funktioniert einwandfrei. Ich lade die XML Datei herunter, speichere diese im Documents Ordner der App und anschließend wird die XML vollständig geparst.


    Allerdings möchte ich auf bestimmte elemente der XML zugreifen und diese global in der App verfügbar machen, da ich mehrere Views habe.

    Wahrscheinlich muss ich das alles in dieser methode handeln:

    Quellcode

    1. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
    2. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    3. attributes:(NSDictionary *)attributeDict {


    Allerdings weiss ich nicht wie.

    Aktuell gebe ich alle Geparsten elemente in der konsole so aus:

    Quellcode

    1. NSLog(@"Processing Element: %@", elementName);


    Wie mach ich das nun, das ich angenommen auf das Element 'user' zugreife?

    XML:
    <?xml version="1.0" encoding="UTF-8"?>
    <part>
    <user>
    <userId>999</userId>
    </user>
    </part>

    Danke für jegliche Hilfe,
    brush51
  • Nein, Du muss noch die Delegate Methode


    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string


    und


    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

    implementieren (je nach dem reichen die beiden auch).

    Du solltest aber bedenken, dass foundCharacters: mehrmals für ein Element aufgerufen werden kann, also in Deinem Beispiel etwa einmal mit "99" und dann noch einmal mit "9" (was dann den String "999" ergibt)

    Alex
    The only thing that really worried me was the ether.
  • Danke für den Hinweis, mein Fehler, habe es nicht bedacht, die anderen beiden Methoden zu erwähnen. Die habe ich bereits mit drin.
    Wie gesagt, das Parsen der ganzen XML funktioniert auch soweit.
    Jedoch würde ich gerne nur ein bestimmtes Element auslesen und ausgeben, sodass ich es später ein einer anderen Klasse einem Label zuweisen kann:

    AndereKlasse.M

    Quellcode

    1. labelUserId.text = userIdAusDerXMLAusgelsen.


    Warum kann es mehrmals vorkommen? Ist mir bisher nicht aufgefallen.
  • Was ist denn Dein Problem genau, wenn Du die Methoden schon hast?

    Das mehrmals auftreten liegt an den Eigenheiten von XML und den dazugehörigen Parsern. Für den Moment sage ich mal ganz fies: "Ist halt so"

    Alex
    The only thing that really worried me was the ether.
  • Ich verstehe dein problem leider auch nicht. Hast du schon alles geparsed und willst es nur noch zu Verfügung stellen? Beachtest du das Design-Pattern MVC? Du könntest die Daten entweder in einem Objekt oder direkt dem AppDelegate geben und darin speichern.
    Gruß

    Robin

  • @below: Ich möchte die geparsten Elemente in Variablen speichern, sodass ich diese Global verwenden kann.
    Meine XML ist ja nicht die paar Zeilen lang, sondern enthält wesentlich mehr Elemente.

    @robin_:
    Ich habe eine Klasse User erstellt und dort die Variablen vom User angelegt, wie z.b. userId, name usw. usf.
    Genau, alles wird geparst und möchte die Elemente zur verfügung stellen.
  • Das ist dann aber ein Bisschen Datenstrukturen 101:

    Wenn Du weisst, wie Du EIN User Element ausliest, weist Du ja auch, wie man alle liest. Du kannst sie in einer Liste Speichern, oder Objekte anlegen oder oder oder

    Alex
    The only thing that really worried me was the ether.
  • Ich hab attributeDict mal geloggt und es ist immer leer:

    Quellcode

    1. NSLog(@"Attribute dict: %@", attributeDict);


    Hab gerade in der Doku mal nachgeschlagen. Da ich keine Attribute habe, ist das attributeDict logischerweise immer leer.
    Doku ausschnitt:

    "A dictionary that contains any attributes associated with the element. Keys are the names of attributes, and values are attribute values."

    Ich glaub aber das ist der falsche Ansatz, da ich ja keinerlei attribute habe. Deswegen kann ich ja weder objectForKey und valuesForKey verwenden.
    Sehe ich doch richtig oder?



  • Speichere dir doch einfach den aktuellen Elementnamen an. In der Methode die du am Anfang nennst kommt doch folgendes vor: didStartElement:(NSString *)elementName
    Speichere dir den elementName in eigeber Vari. In der FoundChara fragst du dann ab, ob deine Vari dem gewünschten String (UserID bspw.) übereinstimmt und machst dann was. Das gleiche machst du dann beim didEndElement. wenn der elementName /Vari mit deinem WunschString übereinstimmt, dann speicherst du das.
    Kurz und Bündig: Der "elementName" ist das gesuchte ;)

    Grüße,
    Juji