みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

SwitでNSXMLParserを使用し、パースしました。
そのあと、下記のXMLから例えばAAAAの値であるああああを
画面上に表示したいのですが方法がわかりません。
どなたかご教示ください。

<aside class="ABC">
<ul>
<li class="AAAA">ああああああ</li>
<li class="BBBB">いいいいいい</li>
<li>うううううう</li>
</ul>
</aside>

※内容が理解できる方のみご回答をお願いいたします。

投稿日時 - 2015-01-11 17:22:58

QNo.8887800

すぐに回答ほしいです

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

回答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
}
}
}

投稿日時 - 2015-01-12 10:45:58

補足

詳細に記載いただきありがとうございました。
今後、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>

投稿日時 - 2015-01-13 20:02:02

お礼

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

投稿日時 - 2015-01-16 11:37:46

ANo.3

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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
}

意固地にならず、あなたがなにができて、どこから先ができないのか、なにを習得して、なにが未習得なのか……まあ、たしかにそういう説明がちゃんとできるのなら、質問するまでもなくじぶんで学習できるんでしょうが、つたないながらも、言葉を尽くして、説明しようとする姿勢は、回答者に理解してもらえると思いますよ。いかが?

投稿日時 - 2015-01-11 19:51:39

補足

ご回答ありがとうございます。
言葉足らずで申し訳ございません。
>意固地にならず、あなたがなにができて、どこから先ができないのか、なにを習得して、なにが未習得なのか
.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
}
}

投稿日時 - 2015-01-11 21:55:17

ANo.1

> ※内容が理解できる方のみご回答をお願いいたします。

ですから、あなたの説明では、だれひとりとして「内容が理解でき」ないよ、ということを、くりかえし申し上げているのですが?

投稿日時 - 2015-01-11 19:26:46

あなたにオススメの質問