XML in Function --> Dictionary

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • XML in Function --> Dictionary

    Quellcode

    1. let downloadURL = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
    2. var dict = [String: Double ]()
    3. if let parser = XMLParser(contentsOf: URL(string: downloadURL)!) {
    4. parser.parse()
    5. }
    Hallo Ihr Experten,

    ich bin wahrlich kein Crack mit Swift, daher wende ich mich mal an die Experten. Ich versuche ein XML File zu Parsen, doch das klappt leider gar nicht. Ich komme einfach nicht auf die Werte der geparsten Daten ran. Grob gesagt, hat die XML Datei zwei Attribute, Währung und Kurs. Genau diese beiden möchte ich nun in ein Dictionary bekommen (bsp. "USD" 1.06). Doch wie kann ich durch die XML iterieren?

    Schon mal vielen Dank
    Wolf
  • Also... Ähhmmm... Ein bißchen Googeln wäre da schon angebracht. Stichwörter wie Apple, Swift, MacOS, iOS, XML, etc. bringen da Unsummen an Links mit denen man weiterarbeiten kann; z.B. u.a. den ziemlich umfangreichen Tree-Based XML Programming Guide, in den ich auch immer wieder reinschaue, wenn ich feststelle, daß mein XML-Parsing verrostet ist...

    XML ist nicht ganz trivial. Es gibt da verschiedene Ansätze und verschiedene API-Abstraktionshöhen, abgesehen von den Tücken des Formats. @Michael hat da auf eine Variante Hingewiesen, die auch noch einiges an Arbeit abverlangt.

    Wie dem auch sei. Aus Spaß an der Sache habe ich da gerade mal was für diese konkrete Abfrage mit spitzer Nadel auf die Schnelle zusammengekleistert; auf Basis von xPath.

    Quellcode

    1. import Foundation
    2. // Parsing routine
    3. func currencyRates() throws -> [String: Double] {
    4. let urlString = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
    5. let xPath = "//Cube[@currency]"
    6. var ratesDict = [String: Double]()
    7. guard
    8. let url = URL(string: urlString),
    9. let _nodes = try XMLDocument(contentsOf: url, options: 0).rootElement()?.nodes(forXPath: xPath),
    10. let nodes = _nodes as? [XMLElement]
    11. else { return ratesDict }
    12. for node in nodes {
    13. guard
    14. let code = node.attribute(forName: "currency")?.stringValue,
    15. let _rateString = node.attribute(forName: "rate")?.stringValue,
    16. let rate = Double(_rateString)
    17. else { continue }
    18. ratesDict[code] = rate
    19. }
    20. return ratesDict
    21. }
    22. do {
    23. // retrieve and parse data
    24. let rates = try currencyRates()
    25. // print the data
    26. for (key, value) in rates {
    27. print("\(key):\t\(value)")
    28. }
    29. }
    30. catch {
    31. print(error)
    32. }
    Alles anzeigen
    Dateien
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von torquato ()

  • Hallo Zusammen,

    schon mal vielen Dank. Doch leider kennt er XMLDocument nicht in der Foundation (für iOS) ein ähnliches Problem habe ich auch mit dem XMLParserDelegate. Gibt es denn wirklich keine vernünftige Dokumentation (mit Beispiel) um da mal zwei Felder zu extrahieren?

    By the way, ich Google mir da einen ab doch alles was man so findet funktioniert nicht oder ist in ObjectiveC :(

    Schöne Grüsse
    Wolf
  • Wolf schrieb:

    Hallo Zusammen,

    schon mal vielen Dank. Doch leider kennt er XMLDocument nicht in der Foundation (für iOS) ein ähnliches Problem habe ich auch mit dem XMLParserDelegate. Gibt es denn wirklich keine vernünftige Dokumentation (mit Beispiel) um da mal zwei Felder zu extrahieren?

    By the way, ich Google mir da einen ab doch alles was man so findet funktioniert nicht oder ist in ObjectiveC :(

    Schöne Grüsse
    Wolf
    XMLDocument gibt es auch nur für macOS - äußerst schade. Apple hast wohl XML-Handling für iOS^^
  • matz schrieb:

    XMLDocument gibt es auch nur für macOS - äußerst schade. Apple hast wohl XML-Handling für iOS^^
    Wenn man unbedingt DOM & XPath verwenden will, gibt's da die libxml2. Dafür gibt's auch Wrapper wie TouchXML. Wahrscheinlich gibt's auch entsprechendes für die abstürzende Schwalbe. ;)

    Wenn man das Prinzip eines SAX-Parsers verstanden hat, möchte man aber eigentlich kein DOM mehr machen.
    „Meine Komplikation hatte eine Komplikation.“
  • Wolf schrieb:

    für iOS

    Diese Anforderung war aus dem Eingangspost nicht ersichtlich.

    matz schrieb:

    XMLDocument gibt es auch nur für macOS - äußerst schade.

    Aha. War mir nicht bewußt. Merkwürdig. Kann sich da jemand eine sinnvolle Erklärung zusammenreimen?

    Wie dem auch sei. Dann halt anbei eine iOS-Version mit [NS]XmlParser auf die Schnelle zusammengetackert.

    Edit: Anhang hinzugefügt.
    Dateien
    Das iPhone sagt: "Zum Antworten streichen". Wie? Echt Jetzt? Muß ich erst die Wohnung streichen!?
  • macmoonshine schrieb:

    matz schrieb:

    XMLDocument gibt es auch nur für macOS - äußerst schade. Apple hast wohl XML-Handling für iOS^^
    Wenn man unbedingt DOM & XPath verwenden will, gibt's da die libxml2. Dafür gibt's auch Wrapper wie TouchXML. Wahrscheinlich gibt's auch entsprechendes für die abstürzende Schwalbe. ;)
    Wenn man das Prinzip eines SAX-Parsers verstanden hat, möchte man aber eigentlich kein DOM mehr machen.
    An Touch oder KissXML sieht man wie gut es sein kann. Schade eigentlich wenn man sieht wie viel XML Apple intern verwendet.
  • matz schrieb:

    macmoonshine schrieb:

    matz schrieb:

    XMLDocument gibt es auch nur für macOS - äußerst schade. Apple hast wohl XML-Handling für iOS^^
    Wenn man unbedingt DOM & XPath verwenden will, gibt's da die libxml2. Dafür gibt's auch Wrapper wie TouchXML. Wahrscheinlich gibt's auch entsprechendes für die abstürzende Schwalbe. ;) Wenn man das Prinzip eines SAX-Parsers verstanden hat, möchte man aber eigentlich kein DOM mehr machen.
    An Touch oder KissXML sieht man wie gut es sein kann. Schade eigentlich wenn man sieht wie viel XML Apple intern verwendet.
    TouchXML finde ich vollkommen in Ordnung (Gibt dazu sogar einen Abschnitt im Buch). KissXML kenne ich nicht. Ich würde DOM und Xpath aber nur einsetzen, wenn ich einen eher punktuellen Zugriff auf das Dokument brauche. Will man eher alle Daten haben, eignet sich ein SAX-Handler besser.
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    matz schrieb:

    macmoonshine schrieb:

    matz schrieb:

    XMLDocument gibt es auch nur für macOS - äußerst schade. Apple hast wohl XML-Handling für iOS^^
    Wenn man unbedingt DOM & XPath verwenden will, gibt's da die libxml2. Dafür gibt's auch Wrapper wie TouchXML. Wahrscheinlich gibt's auch entsprechendes für die abstürzende Schwalbe. ;) Wenn man das Prinzip eines SAX-Parsers verstanden hat, möchte man aber eigentlich kein DOM mehr machen.
    An Touch oder KissXML sieht man wie gut es sein kann. Schade eigentlich wenn man sieht wie viel XML Apple intern verwendet.
    TouchXML finde ich vollkommen in Ordnung (Gibt dazu sogar einen Abschnitt im Buch). KissXML kenne ich nicht. Ich würde DOM und Xpath aber nur einsetzen, wenn ich einen eher punktuellen Zugriff auf das Dokument brauche. Will man eher alle Daten haben, eignet sich ein SAX-Handler besser.
    Ich meide XML soweit es geht :D