0

ファイルに次のようなものが含まれるURLとしてXMLファイルがあります。

<Products>
<products id="1">
<name>product1</name>
<price>$150</price>
<img>http://www.myimage.com/Main_pic.png</img>
</products>
</Products>

NSXMLParser を使用してデータと画像を取得できますが、それらのデータを取得した後、NSMutableArray または NSDictionary に格納する方法がわかりません。また、 Lazy Loading Table Images Asynchronous Downloading from Appleから遅延読み込み非同期画像ダウンロードを実装しようとしました。しかし、私は画像を読み込めませんでした。非同期ロードの代替手段はありますか。

親切に私を詳しく説明してください、

  1. aysnchronousダウンロードでurl XMLファイルから取得したデータを格納する方法。
  2. データと画像を分離する方法。
  3. それらを UIImage に実装し、データを iPhone で表示する方法。

編集済み

理解を深めるために、テーブルビューではなく、下の図のようなデータと画像が必要です。 サンプル画像

EDITED-2 遅延読み込み解析を使用して、参照用のコードをここのコンテンツに従って変更しました。

- (void)main{
self.workingArray = [NSMutableArray array];
self.workingPropertyString = [NSMutableString string];
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:dataToParse];
[parser setDelegate:self];
[parser parse];
if (![self isCancelled]){
self.completionHandler(self.workingArray);}
self.workingArray = nil;
self.workingPropertyString = nil;
self.dataToParse = nil;}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"Products"]){
self.workingEntry = [[egsLists alloc] init];}
storingCharacterData = [elementsToParse containsObject:elementName];}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if (self.workingEntry){
if (storingCharacterData){
NSString *trimmedString = [workingPropertyString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
[workingPropertyString setString:@""];
if ([elementName isEqualToString:sIDStr]){
self.workingEntry.ProductID = trimmedString;}
else if ([elementName isEqualToString:sImageStr]){
self.workingEntry.img = trimmedString;}}
else if ([elementName isEqualToString:@"Products"]){
[self.workingArray addObject:self.workingEntry];
self.workingEntry = nil;}}}


- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if (storingCharacterData){
[workingPropertyString appendString:string];}}
4

1 に答える 1

1

NSObjectクラスを取るDataClass

// データのオブジェクトを作成しDataClass.hSynthesizeそれらをDataClass.m

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName 
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

DataClass *mydata=[[DataClass alloc]init];

if ([elementName isEqualToString:@"id"]) 
    {
mydata.idvalue=[currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
if ([elementName isEqualToString:@"name"]) 
    {
mydata.namevalue=[currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
if ([elementName isEqualToString:@"price"]) 
    {
mydata.pricevalue=[currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
if ([elementName isEqualToString:@"img"]) 
    {
mydata.imgLink=[currentNodeContent stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}


[myArray addObject:mydata];



}

その後、必要に応じて、使用している場合は配列からデータを取得できますTableView

次に、CellForRowAtindexPathメソッドで次を使用します。

DataClass *mydata=[[DataClass alloc]init];
mydata=[myarray objectAtindex:indexPath.row];

cell.textlabel.text=mydata.nameValue;
cell.imageView.image=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:mydata.imglink]]];

画像の読み込みには、Apple のLazyTableImages SampleCodeを使用できます。

http://developer.apple.com/library/ios/#samplecode/LazyTableImages/Introduction/Intro.html

完全な XML 解析については、チュートリアルを参照するか、以下のコードを使用してください。

ソース: http://www.theappcodeblog.com/2011/05/09/parsing-xml-in-an-iphone-app-tutorial/

   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://opentestdrive.com/Products.xml"]];

        // Perform request and get JSON as a NSData object


        NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];


        NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding] ;


        NSLog(@"responseString=%@", responseString);

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

        [request setURL:[NSURL URLWithString:url]];
        [request setHTTPMethod:@"GET"];

        NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];
        if (conn)
        {
            receivedData = [[NSMutableData data] retain];
        }
        else
        {
        }



- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [receivedData appendData:data];
}


- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementname isEqualToString:@"imgName"]) 
    {
        //if you Taking any NSObject Class then Alloc init here.
    }
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    if ([elementname isEqualToString:@"name"]) 
    {
        namelable.text=currentNodeContent;
    }
    if ([elementname isEqualToString:@"price"]) 
    {
        pricelabel.text = currentNodeContent;
    }
    if ([elementname isEqualToString:@"imgName"]) 
    {
        imageView.image=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:currentNodeContent]]];
    }
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
于 2012-11-30T05:15:08.663 に答える