2015-07-29 2 views
0

Мне нужно проанализировать данные xml с помощью nsxmlparser. Но я столкнулся с проблемой получения необходимых данных и их хранения в массиве или словаре с помощью swift. Я реализовал функция делегата и в состоянии найти имя элемента, как этотПроведите анализ массива xml и сохраните данные в массиве или словаре с помощью swift

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) 
{ 
    println(elementName) 
    if(elementName == "subCategories") 
    { 
     categoryName: String = [attributeDict valueForKey:"category"]; 
     id = [attributeDict valueForKey:"id"]; 
     name = [attributeDict valueForKey:"name"]; 
     // Now You can store these in your preferable data models - data objects/array/dictionary 
    } 

однако м не в состоянии реализовать то же самое с помощью swift.My XML выглядит следующим образом

<category> 
    <id>cat00000</id> 
    <name>Best Buy</name> 
    <active>true</active> 
    <path> 
    <category> 
     <id>cat00000</id> 
     <name>Best Buy</name> 
    </category> 
    </path> 
    <subCategories> 
    <category> 
     <id>abcat0100000</id> 
     <name>TV &amp; Home Theater</name> 
    </category> 
    <category> 
     <id>abcat0200000</id> 
     <name>Audio</name> 
    </category> 
    <category> 
     <id>abcat0300000</id> 
     <name>Car Electronics &amp; GPS</name> 
    </category> 
+0

Здесь мне нужно получить доступ к категории в узле подкатегорий. Мне нужно зациклиться, как только имя элемента будет подкатегорией. Пожалуйста, предложите – RPP

ответ

1

Это странное сочетание Свифта и цель -С вы отправили, и похоже, вы пытаетесь прочитайте атрибуты каждого <category>, но вам действительно нужно получить значение каждого дочернего узла <category>. Попробуйте следующее:

class CategoryParser: NSObject, NSXMLParserDelegate { 

    var subcategories = [[String : String]]() 
    var currentSubcategory: [String : String]? 
    var currentElementName: String? 

    var completion: (([[String : String]]) ->())? 

    func parseXML(string: String, completion: (([[String : String]]) ->())?) { 
     guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else { 
      fatalError("Base XML data") 
     } 
     self.completion = completion 
     let parser = NSXMLParser(data: data) 
     parser.delegate = self 
     parser.parse() 
    } 

    func parserDidEndDocument(parser: NSXMLParser) { 
     self.completion?(self.subcategories) 
    } 

    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) { 
     print("Parse error: \(parseError)") 
    } 

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

     if let elementName = self.currentElementName { 
      if [ "id", "name" ].contains(elementName) { 
       self.currentSubcategory?[ elementName ] = string 
      } 
     } 
    } 

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
     if elementName == "category", let subcategory = self.currentSubcategory { 
      self.subcategories.append(subcategory) 
      self.currentSubcategory = nil 
     } 
    } 

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

     if elementName == "category" { 
      self.currentSubcategory = [String : String]() 
     } 
     else { 
      self.currentElementName = elementName 
     } 
    } 
} 



let categoryParser = CategoryParser() 
let xmlString = "<subCategories><category><id>someId</id><name>someName</name></category></subCategories>" 
categoryParser.parseXML(xmlString) { (categories) in 
    print(categories) 
}