2016-11-18 10 views
0

그래서 계속 추적하기 위해 고심하고 있습니다.다른 클래스에서 사용할 사용자 정의 클래스의 구문 분석 된 요소를 가져 오거나 사용하십시오.

필자는 필요한 요소를 파싱했지만 다른 클래스에서는 호출 방법을 알아낼 수 없습니다. 여기 내가 작성한 맞춤 클래스가 있습니다.

class SoapTipParser: NSObject, XMLParserDelegate, NSURLConnectionDelegate { 

    var webData:NSMutableData = NSMutableData() 
    var parser:XMLParser? 
    var flag: Bool? 
    var capturedString: String? 
    var conteudos: [LoginCentralResponse?]? //tips 
    var elementos: LoginCentralResponse? //tip 
    var delegate: SoapTipParserDelegate? 



    func processXmlResponse(data :NSData) { 
     parser = XMLParser(data: webData as Data) 
     parser!.delegate = self 
     parser!.parse() 

    } 

    func loginCentral() { 
     //Envelope com o request 
     var soapMessage = "<soapenv:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:log='LoginCentral'><soapenv:Header/><soapenv:Body><log:LoginCentral soapenv:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'><Autenticacao xsi:type='urn:Autenticacao' xmlns:urn='urn:RouterBoxMobile'><ChaveIntegracao xsi:type='xsd:string'>sL8xlbkw2454kLx3i832190461000160Lxd5yV055sKc3gHx9346</ChaveIntegracao></Autenticacao><DadosLoginCentral xsi:type='urn:DadosLoginCentral' xmlns:urn='urn:RouterBoxMobile'><Usuario xsi:type='xsd:string'>wagner</Usuario><Senha xsi:type='xsd:string'>mudar123</Senha></DadosLoginCentral></log:LoginCentral></soapenv:Body></soapenv:Envelope>" 


     //link como string 
     let urlString = "https://desenvtest.routerbox.com.br/routerbox/ws_mobile/rbx_server_mobile.php?wsdl" 

     let url = NSURL (string: urlString) 

     //Pega, parsea, e le 
     let theRequest = NSMutableURLRequest(url: url! as URL) 

     let countElements = soapMessage.characters.count 

     theRequest.addValue("text/xml", forHTTPHeaderField: "Content-Type") 
     theRequest.addValue(String(countElements), forHTTPHeaderField: "Content_length") 
     theRequest.httpMethod = "POST" 
     theRequest.httpBody = soapMessage.data(using: String.Encoding.utf8, allowLossyConversion: false) 

     let urlConnection = NSURLConnection(request: theRequest as URLRequest, delegate: self, startImmediately: true) 
     urlConnection!.start() 

     if (urlConnection != nil) { 
      var webData : Void = NSMutableData.initialize() 

     } 

    } 

    func connection(_ connection: NSURLConnection, didFailWithError error: Error) { 


    } 


    func connection(_ connection: NSURLConnection, didReceiveResponse response: URLResponse) { 
     webData.length = 0; 

    } 

    func connection(_ connection: NSURLConnection, didReceiveData data: Data) { 
     webData.append(data as Data) 

    } 

    func connectionDidFinishLoading(_ connection: NSURLConnection) { 
     var xmlStr = NSString(data: webData as Data, encoding: String.Encoding.utf8.rawValue) 
     print(xmlStr) 
     processXmlResponse(data: webData) 
    } 

    //XML Parser 
    func parserDidStartDocument(_ parser: XMLParser) { 
     flag = false 
     capturedString = "" 
     conteudos = [] 

    } 
    func parserDidEndDocument(_ parser: XMLParser) { 

     print("count of tips is \(conteudos!.count)") 

     for (index, conteudo1) in (conteudos?.enumerated())! { 
      print("CodigoCliente e: \(conteudo1?.CodigoCliente)") 
      print("Permissoes são: \(conteudo1?.Permissoes)") 

     } 


    } 

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



     if elementName == "CodigoCliente" { 
      flag = true 
     } 
     if elementName == "Permissoes" { 
      flag = true 
     } 
     //print("a") 
    } 

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 

     flag = false 


     if elementName == "CodigoCliente" { 
      elementos?.CodigoCliente = capturedString 
     } 
     if elementName == "Permissoes" { 
      elementos?.Permissoes = capturedString 
     } 

     //print("ak") 
    } 

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

     if flag! { 
      capturedString = capturedString! + string 
     } 
     //print("akii") 
    } 

    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { 

    } 

} 

하지만 매번 다음 클래스에서 구문 분석 된 요소를 호출하려고하면 결과가 0이됩니다. 좋아

+0

? 이 클래스를 어떻게 사용합니까? 호출 코드를 제공 할 수 있습니까? – OliverM

+0

'var tipParser : SoapTipParser? override func viewDidLoad() { super.viewDidLoad() // 뷰를로드 한 후 추가 설정을 수행하십시오. tipParser = SoapTipParser() tipParser! .loginCentral() }' –

+0

그리고 당신의 결과를 가져 했습니까? tipParser.elementos는 파싱 후에 채워야합니까? 아니면 데이터가 없다는 문제입니까? – OliverM

답변

0

, 난, 당신은 elementos를 초기화하지 않은 거 같아요, 그래서이 두 라인 모두가 전무 개체에 설정하려고

elementos?.CodigoCliente = capturedString 
elementos?.Permissoes = capturedString 

. 그래서 아무 일도 일어나지 않습니다. elementos 속성을 초기화해야하며 제대로 작동해야합니다.

정의의 예를 들면 :

var elementos = LoginCentralResponse() 

(있는 경우 이러한 초기화.)

나는 당신의 문제가 정확히 무엇인지 이해 해달라고