Upload
hasegawa
View
665
Download
0
Embed Size (px)
Citation preview
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
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つ次にある兄弟ノードを取得する
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属性ノードの配列を取得します