Получить данные XML в строку в Swift 4 IOS - PullRequest
0 голосов
/ 14 мая 2018

У меня есть XML (в формате String), я хочу получить отдельные значения из него в строковые переменные, используя Swift 4.

Мои данные приведены ниже:

let myString ="Adasdnajinasdshabjdbaiusd" //Encrypted Text(Sample)
let MyResult = self.TestObj.decryptData(myString); //Method for Encryption
print(MyResult) // Result in String Format

Вывод MyResult здесь:

<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><userDetails><status>success</status><name>Ashique</name><role>admin</role></userDetails>
.

Это в строковом формате. Итак, как я могу получить эти значения, такие как имя и роль, в строковые переменные в Swift 4?

Заранее спасибо!

Ответы [ 6 ]

0 голосов
/ 07 января 2019

Структура XML:

<Services>
    <Service>
        <ServiceCode>7711</ServiceCode>
        <ServiceType>FLIGHT</ServiceType>
        <Supplier>Hüseyin METİN</Supplier>
        <Name>7711 (V)</Name>
    </Service>
</Services>

Код:

//Model.swift
class Service {
    var ServiceCode: Int
    var ServiceType: String
}

//ViewController.swift
class MonitorViewController: UIViewController {

    private var services: [Service] = []
    private var foundedService: Service?
    private var activeElement: String?

    //...
}

extension MonitorViewController: XMLParserDelegate {

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {

        if elementName == "Service" { // your element name
            foundedService = Service(ServiceCode: 0, ServiceType: "")
        }

        activeElement = elementName
    }

    func parser(_ parser: XMLParser, foundCharacters string: String) {
        switch activeElement {
        case "ServiceCode": foundedService?.ServiceCode = Int(string) ?? 0
        case "ServiceType": foundedService?.ServiceType = string
        default: break
        }
    }

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        if elementName == "Service" { // your element name
            services.append(foundedService!)
            foundedService = nil
        }
    }

    func parserDidEndDocument(_ parser: XMLParser) {
        servicesTableView.reloadData()
    }
}
0 голосов
/ 20 мая 2018

У вас есть несколько решений.

  • Используйте XMLParser и XMLParserDelegate, затем функцию parser
  • Использовать библиотеку наподобие SwiftyXMLParser
0 голосов
/ 14 мая 2018

Если вы не возражаете против использования внешней библиотеки, вы можете попробовать XMLMapper .

. Вы можете использовать следующую модель:

class UserDetails: XMLMappable {
    var nodeName: String!

    var status: String?
    var name: String?
    var role: String?

    required init(map: XMLMap) { }

    func mapping(map: XMLMap) {
        status <- map["status"]
        name <- map["name"]
        role <- map["role"]
    }
}

.XML строка типа:

let userDetails = XMLMapper<UserDetails>().map(XMLString: MyResult)

Надеюсь, это поможет.

0 голосов
/ 14 мая 2018

С помощью SwiftyXMLParser это сработало .. вот модуль:

модуль "SwiftyXMLParser",: git => 'https://github.com/yahoojapan/SwiftyXMLParser.git'

import SwiftyXMLParser
myString = <userDetails><status>success</status><name>Ashique</name></userDetails>


let xml1 = try! XML.parse(MyString!)                       
// access xml element
var element1 = xml1["userDetails"]["status"]; // Will Provide result -> success
var element2 = xml1["userDetails"]["name"] // will provide result -> Ashique
0 голосов
/ 14 мая 2018
class ViewController: UIViewController , XMLParserDelegate , URLSessionDelegate {

    var parser:XMLParser?
    var foundChars: String = ""
    var personsStr: String = ""
    var currentElementName: NSString = ""
    var elementValue: String?

    override func viewDidLoad() {
        super.viewDidLoad()

         getPaticularInviteDetails(inviteId:"781")
    }

    func getPaticularInviteDetails(inviteId:String) {

            let soapMessage = "your_soap_request"
            let urlString = "your_soap_url"
            let url = NSURL(string: urlString)
            let theRequest = NSMutableURLRequest(url: url! as URL)
            let msgLength = soapMessage.characters.count
            theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
            theRequest.addValue(String(msgLength), forHTTPHeaderField: "Content-Length")
            theRequest.httpMethod = "POST"
            theRequest.httpBody = soapMessage.data(using: String.Encoding.utf8, allowLossyConversion: false)

            let session = URLSession.shared
            let task = session.dataTask(with: theRequest as URLRequest, completionHandler: { data, response, error -> Void in

            if error != nil {

                return
            }

            if let dat = data {

                let response = NSString(data: dat, encoding: String.Encoding.utf8.rawValue)
                print("XML Response ",    response!)

                let xmlParser = XMLParser(data: dat)
                xmlParser.delegate = self
                xmlParser.parse()
                xmlParser.shouldResolveExternalEntities = true
            }

            else {


            }
         })

        task.resume()
    }

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

        currentElementName = elementName as NSString

        if elementName == "userDetails"//(your value) {

            print("It is coming")
            elementValue = String()
        }
    }

    func parser(_ parser: XMLParser, foundCharacters string: String) {

        particularInviteDetails(string: string)
    }

    func particularInviteDetails(string: String) {

            if elementValue != nil {

                elementValue! += string
            }
            let data: Data? = elementValue?.data(using: String.Encoding.utf8)

            do {

                let json = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any] ?? [:]
                print("\n json in Found Chara:",json)

                if json != nil {

                    let data = json?.object(forKey: "Data") as? String ?? ""
                    convertToDictionary(text: data)
                }

                else {

                }
            }
            catch {

            }
      }

    func convertToDictionary(text: String)  {

        if let data = text.data(using: .utf8) {

            do {

                let dict = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:Any] ?? [:]
                let getData = dict?.value(forKey: "name") as? String ?? ""
                print("Result: ",getData)
            }
            catch {
                print(error.localizedDescription)
            }
        }
    }
}
0 голосов
/ 14 мая 2018

Использование XMLParser с:

let parser = XMLParser.init(data: myString.data(using: .utf8))
parser.delegate = self
parser.parse()

наследует ваш класс от XMLParseDelagate и реализует это:

func parser(parse, element, namespace, name, attributes) {
 // check for your element and get attributes.
 // ..
}

Подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...