0

URLからXMLファイルを取得すると、XMLファイルからすべての要素を解析してログファイルに表示できます。解析コードは次のようになります。

-(id) loadXMLByURL:(NSString *)urlString{
tweets  = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;}


-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if([elementName isEqualToString:@"Products"]){
currentTweet = [egsBase alloc];}}


-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if([elementName isEqualToString:@"img"]){
currentTweet.img=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:currentNodeContent]]];}
if ([elementName isEqualToString:@"Products"]) {
[tweets addObject:currentTweet.img];
currentTweet = nil;
currentNodeContent = nil;}}


- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
 currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];}

解析にはクラス名を使用しますXmlParsing。コントローラクラスでは、クラスファイルXmlParsingを次のように実装していXmlParsing xmlparser;ました。viewDidLoad()関数では、次のようなコードを使用します。

- (void)viewDidLoad{
[super viewDidLoad];
xmlParser = [[XMLParsing alloc] loadXMLByURL:@"http://images.com/Products.xml"];
UIImage *currentImage = [[xmlParser tweets] objectAtIndex:0];
customimage.image = currentImage;}

ここcustomimageにUIImageViewのリファレンスがあります。問題は、最後の要素の値のみを取得して、ストーリーボードに接続されたUIImageViewに表示できることです(つまり、理解を深めるために、要素で使用する前の要素ではなく、最後の要素の画像のみが表示されます) 。これを解決する方法は?どこが間違っているのか。親切に私を提案してください。

XMLの構造

<Products>
 <products id="1">
   <img>http://images.com/images/Main_pic.png</img>
 </products>
 <products id="2">
  <img>http://images.com/images/image1.png</img>
 </products>
</Products>

私のNSLogは、XMLファイルを解析するために表示されます。

images <UIImage: 0x71529a0>
images <UIImage: 0x74a6750>

印刷して取得した画像を確認すると、現在の画像が次のように表示されます。

Current,<UIImage: 0x74a6750>

ここでは、現在の画像が前の要素ではなく最後の要素のみを示していることがわかります

4

2 に答える 2

1

文字列をcurrentnodecontentに追加します

if(!currentNodeContent ) 
    currentNodeContent = [[NSMutableString alloc] initWithString:string];
else
    [currentNodeContent appendString:string];
于 2012-12-04T05:16:34.070 に答える
1
- (void)viewDidLoad
{
 1) [super viewDidLoad];
 2) xmlParser = [[XMLParsing alloc] loadXMLByURL:@"http://images.com/Products.xml"];
 3) UIImage currentImage = [[xmlParser tweets] objectAtIndex:0];
 4) customimage.image = currentImage;
}

理解しやすいように行番号を追加しました:

3行目:常に新しい画像を取得します(私は正しいですか?)

行番号4:新しい画像を取得するたびに、この前の画像が新しい画像に置き換えられるため、その画像を同じimageview(customimage)に設定します。

理想的には、すべての新しい画像をそれぞれの画像ビューに設定する必要があります。

これらの画像をテーブルビューに読み込もうとした場合--- 画像ビューの名前は同じですが、実際にはオブジェクトが異なるため、cellForRowAtIndexPathで割り当てられたTAGを使用して各セルの画像ビューにアクセスする必要があります。

更新されたコード

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{
if([elementName isEqualToString:@"products"])
{
        currentTweet = [egsBase alloc];}}
}

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
  if([elementName isEqualToString:@"img"])
   {
    currentTweet.img=[UIImage imageWithData: [NSData dataWithContentsOfURL: [NSURL URLWithString:currentNodeContent]]];
    [tweets addObject:currentTweet.img];
   }
 if ([elementName isEqualToString:@"products"])
  {
   currentTweet = nil;
   currentNodeContent = nil;
  }
}

説明:「製品」が開始要素として検出されてオブジェクトが作成されたとき、および終了要素が検出されたときに画像がオブジェクトに関連付けられて配列に追加されたときに解析中。エラーは次のとおりです。解析条件で「製品」ではなく「製品」を使用しています

アイデアがお役に立てば幸いです:)

于 2012-12-04T07:32:51.353 に答える