28984


コードはこんな感じです

[code]

    <content:encoded>
    https~
    <content:encoded>
    
[/code]

上のURL部分を取り出して、

[code]

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
    
        switch elementName {
    
        case "item":
            parsedFeed = Feed()
            return
    
        case "title":
            parsedElement = "title"
    
        case "link":
            parsedElement = "link"
    
        case "enclosure":
            parsedImageURL = attributeDict["url"] as String!
    
    
        default:
            return
        }
    }
    
[/code]

のparsedImageURLに代入したいです  
よろしくお願いします


CC BY-SA 3.0
2016-09-19T06:22:01.640
28978
2016-09-20T08:42:21.247
2016-09-20T08:42:21.247
18840
18840
question
swift
swiftでRSSリーダーを作成しているのですが、parserを作って<content:encoded>内のURLを取得したいです


`NSXMLParserDelegate`のどのメソッドで何を処理するかが間違っているようです。  
まず、`NSMutableString`型の`stringBuffer`（と、ここではしておきます）というメンバー変数を用意しておき、`didStartElement`で初期化します。  
`didStartElement`は文字通りエレメントが始まった時に呼ばれるfuncなのでここではまだ`<エレメント名>`を読んだだけで、エレメントの内容に対する処理はなにも出来ることがありません。  
なので、以前のデータが残らないように、ここで`stringBuffer`を初期化し、内容を読み込む準備をします。

[code]

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String, qualifiedName: String, attributes attributeDict: [NSObject : AnyObject])
    {
        stringBuffer = String()
    } // end func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String, qualifiedName: String, attributes attributeDict: [NSObject : AnyObject])
    
[/code]

\----追記----

質問主さんは`attributedDict`からリンクを抜き出そうとしていますが、`attributesDict`に入ってくるのはタグが、

[code]

    <tag attribute1='value1' attribute2='value2' attribute3='value3'>
        tagbody
    </tag>
    
[/code]

という形をして、attributeを持っているとして、value _N_
を取り出したい時に、`attributesDict["attributeN"]`という形で取り出せます。  
が、tagbodyを読み込んで利用したいのでしたらこの段階ではまだ不可能です。  
質問主さんのxmlソースからはどちらとも判別しがたいため、対象のリンクは`<tag>`リンク`</tag>`の様に`tag`の中に平文として埋め込まれている前提で話を続けます。

\----追記終わり----

次にエレメント内の内容そのものを読み込んだ時に呼ばれるのが、`foundCharacters`です。  
これは改行やascii/日本語など、コンテキストの切り替わり毎に呼ばれるようで、何回呼ばれるか解らないため、受け取ったstringを`stringBuffer`に追加していき、取りこぼしが無いようにします。

[code]

    func parser(parser: NSXMLParser, foundCharacters string: String)
    {
        stringBuffer += string
    } // end func parser(parser: NSXMLParser, foundCharacters string: String)
    
[/code]

最後に上の3行目の`</エレメント名>`(多分スラッシュが抜けているのでしょう)が来た時に呼ばれるのが`didEndElement`なので、ここで受け取ったエレメント名を元に、`foundCharlacters`で蓄積した文字列を処理します。  
RSSとの事なので、URLが記載されているのは`<link>`から`</link>`タグの間でしょうから、NSString型の`targetLink`というメンバー変数を用意しておいて、

[code]

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String, qualifiedName qName: String)
    {
        switch elementName {
            case "link":
                targetLink = stringBuffer
            default:
                return
        }
    }// end func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String, qualifiedName qName: String) {
    
[/code]

として`stringBuffer`に溜め込まれ、繋げられたURL文字列をコピーします。  
これでパーサーの処理が終わった後に`targetLink`というメンバー変数にアクセスすればリンクのURLが取得できると思います。


CC BY-SA 3.0
2016-09-19T10:11:19.727
28984
2016-09-20T03:32:05.497
2016-09-20T03:32:05.497
14745
14745
28978
answer