XcodeでXMLファイルを解析する方法

多くのアプリケーションのバックボーンである簡単なタスクの1つは、XMLファイルを解析する機能です。 そして幸いにも、XcodeはObjective-CでXMLファイルを比較的簡単に解析できます。

XMLファイルには、アプリに関する基本データからウェブサイトのRSSフィードまで、あらゆるものを含めることができます。 また、アプリ内の情報を遠隔から更新する素晴らしい方法でもあり、新しい項目をリストに追加するだけで、新しいバイナリをAppleに提出する必要はありません。

XcodeでXMLファイルを処理するには、使用する変数を初期化し、XMLパーサープロセスを開始し、そのプロセスにファイルを送り、個々の要素の開始、個々の要素の終わり、および解析プロセスの終了を示します。

この例では、特定のWebアドレス( URL )を渡してインターネットからファイルを解析します。

ヘッダーファイルの作成から始めます。 これは、ファイルを解析するための最小限の要件を持つ詳細ビューコントローラ用の非常に基本的なヘッダーファイルの例です。

@interface RootViewController:UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * articles;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOLエラー解析。
}

@プロパティ(非構造、保持)IBOutlet DetailViewController * detailViewController;

- (void)parseXMLFileAtURL:(NSString *)URL;

parseXMLFileAtURL関数がプロセスを開始します。 処理が完了すると、NSMutableArrayの「記事」がデータを保持します。 配列は、XMLファイルのフィールド名に関連するキーを持つ変更可能な辞書で構成されます。

必要な変数を設定したので、.mファイルのプロセスのミーティングに移ります:

- (void)parserDidStartDocument:(NSXMLParser *)parser {
NSLog(@ "ファイルが見つかり、解析が開始されました";

}

この関数は、プロセスの開始時に実行されます。 この関数には何も置く必要はありませんが、ファイルの解析が開始されたときにタスクを実行する場合は、ここでコードを記述します。

- (void)parseXMLFileAtURL:(NSString *)URL
{

(Mac OS X 10_5_6; en-us)AppleWebKit / 525.27.1(GeckoのようなKHTML)バージョン/ 3.2.1 Safari / 525.27.1 "; NSString * agentString = @" Mozilla /
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString:URL]];
[request setValue:エージェント文字列forHTTPHeaderField:@ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest:requestResponse:nilエラー:nil];


articles = [[NSMutableArray alloc] init];
errorParsing = NO;

rssParser = [[NSXMLParser alloc] initWithData:xmlFile];
[rssParser setDelegate:self];

//解析しているXMLファイルのタイプによっては、これらをオンにする必要があるかもしれません
[rssParser setShouldProcessNamespaces:NO];
[rssParser setShouldReportNamespacePrefixes:NO];
[rssParser setShouldResolveExternalEntities:NO];

[rssParser parse];

}

この関数は、エンジンに特定のWebアドレス(URL)でファイルをダウンロードし、それを解析するプロセスを開始するように指示します。

サーバーがiPhone / iPadをモバイル版にリダイレクトしようとした場合に備えて、我々はSafariがMac上で動作していることをリモートサーバーに伝えています。

最後のオプションは、特定のXMLファイルに固有です。 ほとんどのRSSファイルと一般的なXMLファイルは、それらをオンにする必要はありません。

- (void)パーサー:(NSXMLParser *)パーサーparseErrorOccurred:(NSError *)parseError {

NSString * errorString = [NSString stringWithFormat:@ "エラーコード%i"、[parseError code]];
NSLog(@ "エラー解析XML:%@"、errorString);


errorParsing = YES;
}

これは、エラーが発生した場合にバイナリ値を設定する簡単なエラーチェックルーティングです。 あなたは何をしているのかに応じて、ここでより具体的なものを必要とするかもしれません。 エラーの場合に処理した後でコードを実行するだけであれば、その時点でerrorParsingバイナリ変数を呼び出すことができます。

(NSString *)qNameの属性:(NSDictionary *)attributeDict {(NSString *)}パブリックメソッド:
currentElement = [要素名コピー];
ElementValue = [[NSMutableString alloc] init];
if([elementName isEqualToString:@ "item"])){
item = [[NSMutableDictionary alloc] init];

}

}

XMLパーサーの要素には、個々の要素の先頭で実行される関数、要素の解析中に実行される関数、要素の最後で実行される関数の3つの関数が含まれています。

この例では、RSSファイルに類似したファイルを解析して、XMLファイル内の「項目」の見出しの下にある要素をグループに分類します。 処理の開始時に、新しいグループが検出されたときに、要素名「item」をチェックし、アイテム辞書を割り当てます。 それ以外の場合は、値の変数を初期化します。

- (void)パーサー:(NSXMLParser *)パーサfoundCharacters:(NSString *)string {
[ElementValue appendString:string];
}

これは簡単な部分です。 文字を見つけると、それらを単に変数 "ElementValue"に追加するだけです。

- (void)パーサー:(NSXMLParser *)パーサーdidEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if([elementName isEqualToString:@ "item"])){
[articles addObject:[アイテムコピー]];
} else {
[アイテムsetObject:ElementValue forKey:elementName];
}

}

要素の処理が終了したら、次の2つのうちのいずれかを実行する必要があります。(1)終了要素が「項目」の場合はグループを終了したので、辞書を記事の配列に追加します"

または、(2)要素が "item"でなければ、その要素の名前と一致するキーで辞書の値を設定します。 (これは、XMLファイル内の各フィールドに個別の変数を必要としないため、動的に処理することができることを意味します)。

- (void)parserDidEndDocument:(NSXMLParser *)parser {

if(errorParsing == NO)
{
NSLog(@ "XML processing done!");
} else {
NSLog(@ "XML処理中にエラーが発生しました");
}

}

これは、解析ルーチンに必要な最後の関数です。 これは単に文書を終了させるだけです。 ここでプロセスを完成させたいコードや、エラーが発生した場合に特別なことをするための特別なコードを記述します。

多くのアプリがここでやりたいことは、データやXMLファイルをデバイス上のファイルに保存することです。 そうすれば、ユーザーが次回にアプリケーションを読み込んだときにインターネットに接続していない場合でも、この情報にアクセスできます。

もちろん、最も重要な部分を忘れることはできません。アプリケーションにファイルを解析するように指示します(ファイルを見つけるためにWebアドレスを与えます)。

プロセスを開始するには、このコード行をXML処理を行う適切な場所に追加するだけです。

[self parseXMLFileAtURL:@ "http://www.webaddress.com/file.xml"];