2015-01-29 2 views
1

Я пытаюсь загрузить данные в формате XML через веб-службы REST. Я уже создал парсер с NSXMLParser и визуализировал данные в TableView.NSXMLParser: Неожиданный результат с символами, отличными от ASCII

У меня проблемы, когда я встречаю в предложениях документа XML с акцентом.

Среди некоторых исследований я обнаружил, this очень похоже на мою проблему и пытался реализовать:

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") 
     } 
    } 
} 

в println (resulset) распечатать весь файл XML правильно декодированного.

Проблема заключается в том, когда я бегу анализатор, акцентированные символы не читаются

Это код, когда я нашел символы в парсера:

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

EDIT:

Это является примером моего документа:

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

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

В println() напечатайте документ правильно, как описано выше.

Вместо этого, когда я иду, чтобы сохранить данные нашли carachter, если «он» спасает меня это:

«Contabilit»

+1

Ok я редактировал я надеюсь, что я был более ясно :) – Stephany

+0

Можете ли вы показать пример того, что вы получаете в String (со ссылкой на источник и что вы ожидаете)? –

+0

Ok Я отредактировал один из примеров – Stephany

ответ

2

parser:foundCharacters: метод делегата можно назвать более чем один раз для одного элемента XML , В вашем примере он будет называться один раз с «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

wow thanks! Но я не понял, почему это работает. Я не понимаю, потому что он разрывает фразу на две части – Stephany