在Swift中解析XML属性

时间:2017-01-21 23:57:31

标签: ios swift xml-parsing

在Swift中,我从vimeo频道解析XML,我有:https://vimeo.com/channels/1000464/videos/rss

我成功地提取了链接,发布日期和视频标题。但是,我想提取缩略图,这是" media:thumbnail"的网址属性。值。由于此值具有缩略图高度,缩略图宽度和缩略图网址的多个属性,因此我不确定如何枚举此值。

以下代码执行解析Feed以提取视频链接和视频标题的实际工作:

class VimeoFeedViewController: UIViewController, NSXMLParserDelegate, UITableViewDataSource, UIWebViewDelegate, UITableViewDelegate
{

    @IBOutlet var tbData: UITableView?

    var parser = NSXMLParser()
    var posts = NSMutableArray()
    var elements = NSMutableDictionary()
    var element = NSString()
    var title1 = NSMutableString()
    var date = NSMutableString()
    var link = NSMutableString()
    var webView = UIWebView()
    var boxView = UIView()
    var selectedCell = NSIndexPath()
    var valueToPass:String!
    var viewToPass: UIView!
    var customWebView = UIWebView()
    var url = NSURL()





    //custom code for webviews to show up
    var postTitle: String = String()
    var postLink: String = String()
    var ename: String = String()
    //end of custom code for webviews to show up

    override func viewDidLoad() {
        super.viewDidLoad()
        self.beginParsing()
        self.tbData?.backgroundColor = UIColor(patternImage: UIImage(named: "home-page-background.png")!)
        webView.delegate = self

    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func beginParsing()
    {
        posts = []
        parser = NSXMLParser(contentsOfURL:(NSURL(string:"https://vimeo.com/channels/1000464/videos/rss"))!)!
        parser.delegate = self
        parser.parse()
        tbData!.reloadData()

    }

    //XMLParser Methods



    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 = ""
            link = NSMutableString()
            link = ""
            postTitle = String()
            postLink = 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")
            }
            if !link.isEqual(nil) {
                elements.setObject(link, forKey: "link")
            }

            posts.addObject(elements)
        }
    }

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

我也可以发布XML Feed中显示的代码,但内容可能相当冗长。所需的缩略图值位于" media:thumbnail" XML的属性。

提前感谢您提供有关如何枚举包含多个属性的xml值的任何帮助。

1 个答案:

答案 0 :(得分:2)

您应该比较解析器中的元素名称:didStartElement:qualifiedName:attributes:并从中提取属性以获取url。它应该是这样的。属性dict包含该元素中的所有属性。

例如,查看此特定元素

<media:thumbnail height="540" width="960" url="https://i.vimeocdn.com/video/611645334_960.webp"/>

如果您为此读取属性dict,它应该是这样的,

["height": "540", "url": "https://i.vimeocdn.com/video/611645334_960.webp", "width": "960"]

以下是提取所需网址的代码,

func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
    if elementName == "media:thumbnail" {
        if let url = attributeDict["url"] {
            print(url)
        }
    }
}