2015-11-29 2 views
0

Мне нужна помощь в анализе XML из URL-адреса. Я много читал об этом и не могу понять, как это получить. Все примеры, которые я нашел, немного неоднозначны с примерами и как захватить информацию из проанализированных XML-данных.XML-анализ в Swift 2 (Xcode 7)

Как бы я разобрать этот XML

<menu> 
    <menuitems> 
     <item price="$10">Pizza</item> 
     <item price="$5">Salad</item> 
     <item price="$3">Bread</item> 
    </menuitems> 
</menu> 

Это учебник я собирался покинуть, но я не мог понять, как этот учебник был доступ к данным в массивах и словаря.

http://www.theappguruz.com/blog/xml-parsing-using-nsxmlparse-swift

В Xcode 7 (Swift 2), как бы я разобрать и получить доступ к этой информации. Я знаю, что это не так, как к нему можно получить доступ, но я ищу что-то вроде кода ниже.

print ("\(item[0].data)") // Pizza // 
print ("\(item[0].price)") // $10 // 

Вот код учебника, но я не мог понять, как получить доступ ко всем данным, проанализированным из URL. Как мне отредактировать этот код, чтобы он соответствовал моей структуре?

import UIKit 
import Foundation 

class ViewController: UIViewController, NSXMLParserDelegate 

    { 

    var parser = NSXMLParser() 
    var posts = NSMutableArray() 
    var elements = NSMutableDictionary() 
    var element = NSString() 
    var title1 = NSMutableString() 
    var date = NSMutableString() 

func beginParsing() 
{ 
    posts = [] 
    parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://images.apple.com/main/rss/hotnews/hotnews.rss"))!)! 
    parser.delegate = self 
    parser.parse() 
} 



func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
{ 
    element = elementName 
    if (elementName as NSString).isEqualToString("item") 
    { 
     elements = NSMutableDictionary() 
     elements = [:] 
     title1 = NSMutableString() 
     title1 = "" 
     date = NSMutableString() 
     date = "" 
    } 
} 

func parser(parser: NSXMLParser, foundCharacters string: String) 
{ 
    if element.isEqualToString("title") { 
     title1.appendString(string) 
    } else if element.isEqualToString("pubDate") { 
     date.appendString(string) 
    } 
} 


func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
    if (elementName as NSString).isEqualToString("item") { 
     if !title1.isEqual(nil) { 
      elements.setObject(title1, forKey: "title") 
     } 
     if !date.isEqual(nil) { 
      elements.setObject(date, forKey: "date") 
     } 
     posts.addObject(elements) 

    } 

    } 

} 
+0

Вы можете попробовать [XMLDictionary] (https://github.com/nicklockwood/XMLDictionary), который анализирует XML в NSDictionary. –

+0

, когда вы называете свой метод beginParsing()? в viewDidLoad()? или это метод делегата? – IamMashed

ответ

4

Похоже, что код парсера был заимствован из чего-то другого. Если это действительно ваш XML, подумайте, что это проще. Единственным трюком в вашем случае является то, что price не является элементом, а всего лишь attributeDict элемента item. И я могу создать свой собственный пользовательский тип, Item, чтобы записать имя и цену элемента.

Во всяком случае, вы могли бы в конечном итоге с чем-то вроде:

struct Item { 
    let name: String 
    let price: String 
} 

var itemName: String? 
var itemPrice: String? 
var items: [Item]! 

func parserDidStartDocument(parser: NSXMLParser) { 
    items = [] 
} 

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
    if elementName == "item" { 
     itemPrice = attributeDict["price"] 
     itemName = "" 
    } 
} 

func parser(parser: NSXMLParser, foundCharacters string: String) { 
    itemName?.appendContentsOf(string) 
} 

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
    if elementName == "item" { 
     items.append(Item(name: itemName!, price: itemPrice!)) 
     itemName = nil 
     itemPrice = nil 
    } 
} 

Когда я делаю это, и печать items, я получаю:

[MyApp.ViewController.Item (название: «Пицца », цена:« $ 10 »),
MyApp.ViewController.Item (название:« Салат », цена:« $ 5 »),
MyApp.ViewController.Item (название:« Хлеб », цена:« $ 3 ») ]

+0

Как напечатать имя или цену определенного номера товара? Например, как бы вы напечатали имя или цену номера позиции 2 в списке. –

+0

'print (items [1] .name)' и 'print (items [1] .price)' – Rob

Смежные вопросы