• ベストアンサー

SWIFTでHtmlのソースの一部を取得

SwitでNSXMLParserを使用し、パースしました。 そのあと、下記のXMLから例えばAAAAの値であるああああを 画面上に表示したいのですが方法がわかりません。 どなたかご教示ください。 <aside class="ABC"> <ul> <li class="AAAA">ああああああ</li> <li class="BBBB">いいいいいい</li> <li>うううううう</li> </ul> </aside> ※内容が理解できる方のみご回答をお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.3

回答No.2への補足に対して: > func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) これは誤りがあるというか、情報が古いというか……現時点でのこのDelegateメソッドの書式は func parser(_ parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI namespaceURI: String!, qualifiedName qualifiedName: String!, attributes attributeDict: [NSObject : AnyObject]!) こうなっています。引数「attributeDict」の型は、NSDictionaryではなく、SwiftのDictionaryです。Xcodeが最新バージョンでなければ、アップデートしてください。 > 参考本を購入しネット上でも色々探しているのですが、方法が見当たりません。 まず、Xcodeのヘルプの使い方を覚えることです。Xcodeのエディタ上で、調べたい語句、ないし手がかりになる語句(この場合は、「NSXMLParser」や、メソッド名)の上に、Optionキー(DOS-V機系キーボードならAltキー)を押しながらマウスカーソルを置くと、マウスポインタが「?」に変わります。クリックするとミニリファレンスが開きます。ミニリファレンスの中のいちばん下、(この場合では)NSXMLParser (Delegate Protocol) Class Referenceをクリックすると、ヘルプウインドウにフルリファレンスが表示されます。 フルリファレンス中の「More related items...」をクリックすると、さらに関連情報を探すことができます。 (ただし、クラスリファレンスはSwift対応ずみですが、各ガイドは、Objective-Cのみの情報です) Xcodeのヘルプにある情報は、すべてネット上で公開されています。Googleで検索したら、Apple Develop提供の情報は、だいたいトップ5には入ってますよ。 NSXMLParserDelegate https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSXMLParserDelegate_Protocol/index.html#//apple_ref/occ/intfm/NSXMLParserDelegate/parser:didStartElement:namespaceURI:qualifiedName:attributes: さて、話を絞り込みましょう。 func parser(_ parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI namespaceURI: String!, qualifiedName qualifiedName: String!, attributes attributeDict: [NSObject : AnyObject]!) 引数「elementName」は、開始タグのエレメント名(タグ名)を指します。この場合は「li」です。 namespaceURIとqualifiedNameは、HTMLレベルでは使いません。というか、私も知りません。 ここで重要なのは、「attributeDict」です。タグの属性が、辞書形式で格納されます。Swiftの辞書(Dictionary)は、ほかの言語ではハッシュテーブルとか連想配列などと呼ばれています。要素にラベル(キー値)が付いている配列クラスのことです。たとえば…… <img src="http://www.apple.com/picture.jpg" width="400" height="300"/> こういうタグに対して…… let imageSource = attributeDict["src"] as String // "http://www.apple.com/picture.jpg" let imageWidth = attributeDict["width"] as String // "400" let imageHeight = attributeDict["height"] as String // "300" このようなタグの属性の取得ができます。 ここまでの内容を反映させた、回答No.2に掲示のサンプルコードの続きをのせます。 func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: [NSObject : AnyObject]!) { if elementName == "li" { if (attributeDict["class"] as String?) == "AAAA" { contentString = "" start = true } } }

red0176
質問者

お礼

ありがとうございました。一旦閉めて再度あげなおします。

red0176
質問者

補足

詳細に記載いただきありがとうございました。 今後、Xcodeのヘルプを参考にしたいと思います。 記載いただいたサンプルですが、例えばディズニーランドのサイト(http://s.tokyodisneyresort.jp/tdl/atrc_list.htm)で 下記のタグから<li class="fp">のファストパス&reg;・チケット 発券中を取得したいといった場合ですが サンプルを使用するとelementnameには先頭から</head>の前のtitleまでしか取得できていないようです。 何か方法はありますでしょうか? <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1 ,minimum-scale=1, maximum-scale=1, user-scalable=no"> <meta name="format-detection" content="telephone=no" /> <link rel="apple-touch-icon" href="/images/common/apple-touch-icon.png"> <link rel="stylesheet" href="/css/common/reset.css" /> <link rel="stylesheet" href="/css/common/parts.css" /> <link rel="stylesheet" href="/css/common/layout.css" /> <link rel="stylesheet" href="/css/common/indivi.css" /> <link rel="stylesheet" href="/css/tdl/layout.css" /> <link rel="stylesheet" href="/css/tdl/indivi.css" /> <script type="text/javascript" src="/js/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="/js/common.js"></script> <title>【公式】アトラクション待ち時間 | 東京ディズニーランド</title> //ここまでしか取得できない </head> <body> ~中略~ <ul class="tab tdl clearfix"> <li class="tdl"><img src="/images/tdl/tabTDL.png" width="150" height="40" alt="Tokyo Disney Land" /></li> <li class="tds"><a href="/tds/atrc_list.htm"><img src="/images/tds/tabTDS-off.png" width="150" height="40" alt="Tokyo Disney Sea" /></a></li> </ul> <aside class="fp"> <ul> <li class="fp">ファストパス&reg;・チケット 発券中</li> <li class="fp-no">ファストパス&reg;・チケット 発券中止</li> <li>アイコンなし:ファストパス&reg;・チケット 未対応</li> </ul> </aside> </div> <li class="fp">ファストパス&reg;・チケット 発券中</li>

その他の回答 (2)

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

あなたの2015/01/03の質問のときに、真摯に回答すべく、サンプルプログラムを作って、用意しています。下記はその抜粋です。 import UIKit class ViewController: UIViewController, NSXMLParserDelegate { override func viewDidLoad() { super.viewDidLoad() let sampleURL = NSBundle.mainBundle().URLForResource("sample", withExtension: "html") let parser = NSXMLParser(contentsOfURL: sampleURL!) parser?.delegate = self if parser?.parse() != nil { println("Parse was success") } else { println("Parse was failed") } } // XML Parser Delegate var contentString: String = "" var start = false func parserDidStartDocument(parser: NSXMLParser!) { contentString = "" start = false } 意固地にならず、あなたがなにができて、どこから先ができないのか、なにを習得して、なにが未習得なのか……まあ、たしかにそういう説明がちゃんとできるのなら、質問するまでもなくじぶんで学習できるんでしょうが、つたないながらも、言葉を尽くして、説明しようとする姿勢は、回答者に理解してもらえると思いますよ。いかが?

red0176
質問者

補足

ご回答ありがとうございます。 言葉足らずで申し訳ございません。 >意固地にならず、あなたがなにができて、どこから先ができないのか、なにを習得して、なにが未習得なのか .netのSEをしておりますが、SWIFTは今回初めて扱っております。参考本を購入しネット上でも色々探しているのですが、方法が見当たりません。 記載いただいたようにparseはできております。その後、下記の関数で中身のデータを操作できるようなのですが、ああああああの箇所を取得しようとしても引数のelementNameにはliのみが取得されてしまいます。属性(attributeDict)なども使用してみましたがうまく出来ません。 ご教示ください。 var currentElementName : String! let itemElementName = "AAA" func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) { currentElementName = nil println(attributeDict) println(qName) if elementName == itemElementName { items.append(Item()) } else { currentElementName = elementName } }

  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

> ※内容が理解できる方のみご回答をお願いいたします。 ですから、あなたの説明では、だれひとりとして「内容が理解でき」ないよ、ということを、くりかえし申し上げているのですが?