25
iPhone輪講第8Lesson15

Cocoa Pro08

Embed Size (px)

Citation preview

iPhone輪講第8回Lesson15

Lesson15XMLとRSS

XML

XMLとはHTMLのようにタグを使ってマーク付けする言語をマークアップ言語(Markup Language)と呼ぶ

XMLもタグによるマークアップ言語のひとつ

HTMLはWebページ専用にデザインされているが,XMLは色々なものに利用できるように設計されている

なので拡張可能なマークアップ言語(eXtensible Markup Language)で,XML

DOMパーサDOM(Document Object Model)パーサXMLがもつ構造をそのままプログラムから操作できるようにしたもの

XMLのタグ同士の階層関係の事を木構造と呼ぶ

木構造を直接操作できるのがDOMパーサrss

link

channel

title

http://...ホットニュース

<rss><channel>

<title>ホットニュース

</title><link>http://...

</link></channel>

</rss>

SAXパーサ

SAX(Simple API for XML)パーサXMLドキュメントを上から読み上げるように処理する

RSSファイル読み上げてみる

『まずrssのタグが来た,次にchannnelのタグが来た,titleのタグが来た,タイトルのテキストがこれで,titleのタグが終わった…』と,タグのはじめと終わり,その間に挟まってテキストを順次レポートする

SAXパーサ

何かを読むたびにレポートが上がってくるので,「イベント駆動型パーサ」とも呼ばれる

<rss><channel>

<title>ホットニュース

</title><link>http://...

</link></channel>

</rss>

start rssstart channelstart titletext “ホットニュース”end titlestart linktext “http://...”end linkend channelend rss

木構造

DOMタイプのパーサを使う場合ポイントとなるのが木構造

木構造は木のような格好をしている構造

根(root),幹(trunk),葉(leaf)がある

特に根の事はルートと呼ぶ事が多い

根(root)

幹(trunk)

葉(leaf)

木構造

根や幹や葉の事をまとめてノード(node)と呼ぶ

木構造ではノード同士の関係も重要

自分よりも上(ルートに近い方)にあるノードを親(parent),下にあるのが子(child)隣の(同じ親を持っている)ノードのことは兄弟(sibling)

親(parent)

子(child)

兄弟(sibling)

木構造

子になるノードは複数いる可能性がある.それに対して親ノードは1つだけ

子の数は0以上で,親の数は常に1となる

ルートノードは例外で,親がいない

親(parent)

子(child)

兄弟(sibling)

CocoaのXMLパーサ

NSXMLDocument,NSXMLNode,NSXMLElementCocoaのXML関係のクラスは,まとめて「NSXMLクラス」と呼ぶ

NSXMLクラスにはDOMパーサと,SAXパーサのためのものが含まれる

DOMパーサのためのNSXMLクラスこれらのうちでよく使われるのがNSXMLDocumentNSXMLNodeNSXMLElement

NSXMLDTDとNSXMLDTDNodeはXMLドキュメントを定義するDTDという使用をサポートするのに使う

DTD(Document Type Definiton)は,XMLドキュメントで使われるタグを定義する

NSObject

NSXMLDocument

NSXMLNode

NSXMLElement

NSXMLDTD

NSXMLDTDNode

SAXパーサのためのNSXMLクラス

SAXパーサのためのクラスはNSXParser

NSObject

NSXMLNode

XMLドキュメントのパースXMLドキュメントをパースするパースにはNSXMLDocumentクラスを使う

以下の初期化メソッドを使うとパースが始まるNSDocument- (id)initWithContentsOfURL:(NSURL*)url options:(unsigned int)mask error:(NSError**)errorXMLドキュメントのURLと,オプションmaskを指定してパースする- (id)initWithData:(NSData*)data options:(unsigned int)mask error:(NSError**)errorXMLドキュメントのデータdataと,オプションmaskを指定してパースする- (id)initWithXMLString:(NSString*)string options:(unsigned int)mask error:(NSError**)errorXMLドキュメントの文字列stringと,オプションmaskを指定してパースする

XMLドキュメントのパースXMLドキュメントをパースするオプションには以下の値を指定できる

NSXMLDocumentTidyXMLを使うと,HTMLもXMLのようにパースできる

これができるとHTMLのタグで木構造で扱える

定数 説明NSXMLDocumentTidyHTML HTMLをXHTMLとして解釈してパースするNSXMLDocumentTidyXML 不正なXMLを正式なXMLに変換してパースするNSXMLDocumentValidata DTDかXML Schemaを使ってXMLドキュメントを検証するNSXMLDocumentXInclude Xincludeで指定されているドキュメントを読み込む

XPath

XMLドキュメントをパースしたら次はそこからノードを取り出すノードを取り出すもっとも単純な方法は親子関係を辿って行く事

まずルートノードを取得して,その子を取り出して,さらにその子を取り出して…を繰り返して行く

XPath

RSSのタイトルを取り出すとする

rssノードの下の,channelノードの下のtitleノードが含むテキストファイル

/rss/channel/titleと書いたらわかりやすい

rss

title

channel

link

description

/rss/channel/title

XPathXMLではあるノードの位置をパスとして書き出す規格としてXpathと呼ばれるものがある

NSXMLにもXPathを指定してノードを取得するnondesForXpath:errorというメソッドがある

NSXMLNode- (NSArray*)nodesForXPath:(NSString*)xpath error:(NSError**)error

Xpathを指定して,ノードを取得する

ノードの情報ノードを取得したら,そのノードに関するいろいろな情報を取得するNSXMLNode- (NSXMLNodeKind)kindノードの種類を取得する用意されている種類は,NSXMLInvalidKind, NSXMLDocumentKind, NSXMLCommentKind, NSXMLTextKind, NSXMLDTDKind, NSXMLEntityDeclarationKind, NSXMLAttributrDeclarationKind, NSXMLElementDeclarationKind, NSXMLNotationDeclarationKind

- (NSString*)nameノードの名前を取得します- (NSString*)stringValueこのノードが含む,テキストを取得します- (NSString*)XMLStringこのノードのXMLドキュメントでの表示を取得する.自分自身のタグも含む

これらのメソッドから何が取得できるのか

次のようなXMLを考える

これをパースするとtitleのタグと,その下にテキストノードとが出来上がる

titleノードからメソッドを使って情報を取得する

<title>楽しいCocoa</title>

メソッド 得られる情報kind NSXMLElementKindname titlestringValue 楽しいCocoaXMLString <title>楽しいCocoa</title>

ノードの親子関係あるノードから親,子,兄弟といった関係にあるノードを取得する事ができる

NSXMLNode- (NSXMLNode*)parent親ノードを取得する- (unsigned int)childCount子ノードの数を取得する- (NSArray*)children子ノードを配列の形で取得する- (NSXMLNode*)childAtIndex:(unsigned int)indexインデックスindexで指定した子ノードを取得する- (NSXMLNode*)previousSibling1つ前にある兄弟ノードを取得する- (NSXMLNode*)nextSibling1つ次にある兄弟ノードを取得する

ノードの親子関係

previousSibling

parent

childAtIndex:

nextSibling

childrenchildCount

XMLドキュメントの関係

それぞれのノードからはそのノードが属しているNSXMLDocumentのインスタンスを取得する事ができる

NSXMLDocumentからはルートノードを取得できる

NSXMLNode- (NSXMLDocument*)rootDocument

このノードを含むNSXMLDocumentのインスタンスを取得する

NSXMLDocument- (NSXMLElement*)rootElement

このドキュメントのルートノードを取得する

属性値の取得

XMLではタグの中に値を指定する事ができる

これを属性と呼ぶ

type = “string”というところが属性

typeのところを属性名,”string”のことを属性値と呼ぶ

<title type =”string”> </title>

属性値の取得ノードから属性を取得するメソッドはNSXMLElementにある

どちらも取得できるのはノードである事に注意

これは属性ノードになる

NSXMLElement- (NSXMLNode*)attributeForName:(NSSring*)name名前nameで指定した属性ノードに取得します- (NSArray*)attributes属性ノードの配列を取得します

おわり