1

特定のWebサービスからの最新のフィードを表示するアプリを作成しています。この目的でNSXMLParserDelegateプロトコルを使用しています。アップルのドキュメントを読み、チュートリアルもいくつか試しましたが、どこかで問題が発生しているようです。方法がわかりません。 didEndElement、foundCharactersは機能しますか、とにかく画像、タイトル、コンテンツ、投稿の公開日を表示したいのですが、ここに私のviewcontroller.hをxmlparsingするのは初めてです(次のコードのtitle要素のみを解析しました)

   @property(nonatomic,strong)NSString *currentElement;
   @property(nonatomic,strong)NSString *currentTitle;
   @property(nonatomic,strong)NSMutableArray *titles;

viewdidload

NSURL *url=[NSURL URLWithString:@"http://www.forbes.com/fast/feed"];
NSXMLParser *parser=[[NSXMLParser alloc]initWithContentsOfURL:url];
[parser setDelegate:self];
[parser parse];
NSLog(@"%d",titles.count);

didStartElement

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
 {

self.currentElement=elementName;

if ([self.currentElement isEqualToString:@"title"]) 
{

    self.currentTitle=[NSMutableString alloc];
    titles=[[NSMutableArray alloc]init];

    titles=[attributeDict objectForKey:@"title"];
}
 }

foundCharacters

 -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
 {

self.currentElement=elementName;

if ([self.currentElement isEqualToString:@"title"]) 
{

    self.currentTitle=[NSMutableString alloc];
    titles=[[NSMutableArray alloc]init];

    titles=[attributeDict objectForKey:@"title"];
}
  }

didEndElement

 -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if([self.currentElement isEqualToString:@"title"])
{
    NSLog(@"%@",self.currentTitle);


}
}

疑い

1)個々のタイトルオブジェクトを追加できるように、タイトル配列をどこで宣言する必要がありますか。didStartElementでの[attributeDictobjectForKey]の使用は何ですか?私のプログラムではnullを返しました

2)foundCharactersデリゲートは実際に何をしますか?それは何を追加しますか?

3)didEndElementの後、コンパイラがfoundCharactersではなくdidStartElementに到達しないのはなぜですか?

4)最後に、xml解析にNSXMLParserDelegateプロトコルを実際に使用する必要がありますが、touchXML、TBXMLなど、raywenderlichで提供されているものに違いはありますか?

長い投稿で申し訳ありませんが、クエリに関してオンラインで満足のいく回答が得られませんでした。すべてのブレークポイントを使用して、デリゲートがどのように呼び出されるかを理解しました。クエリに対するいくつかの啓発的な回答が必要です。ありがとう、申し訳ありません。

4

2 に答える 2

0

didFindCharactersでは、見つかった文字をNSMutableStringに追加するだけで、didEndElementでは、何を終了したかがわかり、見つかった文字列に変数を設定します。

image:image => didEndの文字はリンクの名前であり、URLはdidStartの過去の属性にあります

title-tag didStart => didStart:htmlが開始され、title-tagのdidEndまですべてのタグがhtmlになります

content:didStart => didStart:htmlが開始され、コンテンツのdidEndまですべてのタグがhtmlになります

于 2012-11-11T14:03:24.073 に答える
0

1.解析を開始する前に配列を宣言します。要素(xmlタグ)に出会うたびに、要素を初期化します(読み取っている要素を認識できるようにクラスにBOOLを設定します)。

2.見つかった文字は、タグの値として見つかった文字です。読み取っている(インスタンス変数を読み取っている)要素がわかっている場合は、この文字列を一時的なNSMutableStringに追加し、要素が終了したときにのみ配列に追加する必要があります。 。

3.新しいタグに到達するまで、他の文字の検索を開始しないためです。

あなたが混乱しているようです。あなたがこのXMLコードを持っているとしましょう:

<person> mickey mouse </person>

要素が開始するタグに出会うと、文字列が終了するまで他の文字(文字列全体ではなく、文字列の一部のみ)が見つかり、タグに出会うと要素が終了します。

于 2012-11-11T12:44:35.120 に答える