2015-01-29 2 views
1

REST 웹 서비스를 통해 XML 형식의 데이터를 다운로드하려고합니다. NSXMLParser를 사용하여 파서를 이미 만들고 TableView에서 데이터를 시각화했습니다.NSXMLParser : 비 ASCII 문자로 인해 예기치 않은 결과가 발생했습니다.

액센트로 XML 문서 문장을 볼 때 문제가 있습니다. 나는 내 문제에 this 매우 유사 발견하고 그것을 구현하려고 몇 가지 조사 중

: 내가 정확하게 디코딩 전체 XML 파일을 인쇄 println (resulset)

func parse(handler:() -> Void) { 
    self.handler = handler 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     self.countCategoryScheme = 0 
     var url = NSURL(string: SomeStructure.firstLink); 
     var err:NSError = NSError() 
     var dataString: String = String(contentsOfURL: url!, encoding: NSUTF8StringEncoding, error: nil)! 
     var data: NSData = dataString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)! 
     let parser = NSXMLParser(data: data) 
     let resulset = NSString(data: data, encoding: NSUTF8StringEncoding) 
     println(resulset) 
     parser.delegate = self; 
     parser.parse(); 
     if !parser.parse() { 
      self.delegate?.XMLParserError(self, error: "I Parse Error") 
      println("I Parser error") 
     } 
    } 
} 

.

문제는 내가 파서를 실행할 때 내가 파서의 문자 발견했을 때, 악센트 문자가이 코드

읽을 수 없습니다입니다 :

func parser(parser: NSXMLParser!, foundCharacters string: String!) { 
     myList[position] = string 
    } 

편집 :

이를 내 문서의 한 예입니다.

<Name xml:lang="en" xmlns="">National Accounts</Name> 

<Name xml:lang="it" xmlns="">Contabilità nazionale</Name> 

println()에서 위에서 설명한대로 문서를 올바르게 인쇄하십시오. 내가 데이터를 저장 갈 때 "는"나에게이 절약 경우

대신 carachter을 발견

"Contabilit을"

parser:foundCharacters: 위임 방법은 하나의 XML 요소에 대한 이상 번 호출 할 수 있습니다
+1

내가 좀 더 분명 희망을 편집 한 좋아 :)을 – Stephany

+0

String에서 무엇을 얻는 지 보여주는 예를 보여줄 수 있습니까? (소스를 참조하여 무엇을 기대할 수 있습니까?) –

+0

좋아요, 예를 가지고 편집했습니다 – Stephany

답변

2

. 귀하의 예에서는 을 "Contabilit"과 한 번, "à nazionale"을 사용하여 한 번 호출합니다. didStartElement에서 didEndElement까지 발견 된 문자열을 연결할

따라서, 당신은.

다음은이 작업을 수행하는 방법을 보여주는 간단한 예입니다. 물론 중첩 된 XML 요소가있는 경우 이 더 복잡해집니다.

클래스에 현재 요소의 문자열 속성을 추가

var currentElement : String? 

그리고 다음과 같이 대리자 메서드 구현 :

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) { 

    // If a "Name" element started (which you are interested in), set 
    // currentElement to an empty string, so that the found characters 
    // can be collected. Otherwise set it to nil. 
    if elementName == "Name" { 
     currentElement = "" 
    } else { 
     currentElement = nil 
    } 

} 

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

    // If the "Name" element ended, get the collected string and 
    // append it to your list. 
    if elementName == "Name" { 
     if let name = currentElement { 
      println(name) 
      myList.append(name) 
     } 
    } 
    currentElement = nil 
} 

func parser(parser: NSXMLParser, foundCharacters string: String?) { 

    // If currentElement is not nil, append the found characters to it: 
    currentElement? += string ?? "" 
} 
+0

와우 감사합니다! 하지만 왜 작동하는지 이해하지 못했습니다. 문구가 두 부분으로 나뉘어서 이해가 안됩니다. – Stephany