Разбор XML в IOS Показывает значение NULL в метке?

я делаю анализ XML с помощью NSXMLParserDelegate.. Я получаю нулевое значение, когда печатаю значение в метке... Я использую простой XML-файл, полученный в Интернете. Вы также можете проверить, что находится в этом файле. Кто-нибудь, пожалуйста, помогите.. Здесь мой код

#import "xmlViewController.h"

@implementation xmlViewController
@synthesize label;

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://www.bonifacedesigns.com/tuts/xmltest.xml"]];
    receivedData=[[NSMutableData alloc]initWithContentsOfURL:url];
    dataParser=[[NSXMLParser alloc]initWithData:receivedData];
    dataParser.delegate=self;
    [dataParser parse];
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//    if(!xmlString){
//        
//    }else
//    {
//        [xmlString setString:@""];
//    }
  if([elementName isEqualToString:@"elements"])
  {
      xmlString=[NSMutableString alloc];
      [xmlString setString:@""];
  }

}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    xmlString= (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

        if([elementName isEqualToString:@"element"]){

            NSString *string=xmlString;
            [xmlArray addObject:string];
            label.text=[NSString stringWithFormat:@"%@",xmlArray];

       }

}

@end

Это мой XML-файл... Я хочу распечатать XML-данные с разбором! на моей этикетке. Помогите мне с этим. Я отредактировал код и сейчас проверю

<elements>
<element myData="XML Data Parsed!"/>
</elements>

Проверь это:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
//    if(!xmlString){
//        
//    }else
//    {
//        [xmlString setString:@""];
//    }


  if([elementName isEqualToString:@"elements"])
  {

      xmlString=[[NSMutableString alloc]initWithCapacity:5];
  }

}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    xmlString= (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

        if([elementName isEqualToString:@"element"]){
            [attributeDict objectForKey:@"myData"];
            [xmlString setString:@""];
            NSString *string=xmlString;
            [xmlArray addObject:string];
            label.text=[NSString stringWithFormat:@"%@",xmlArray];

       }

Я получаю сообщение об ошибке:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to mutate immutable object with setString:'
*** First throw call stack:
(0x13ba052 0x154bd0a 0x1362a78 0x13629e9 0x1387970 0x2a26 0x9e1a35 0x5171532 0x9e002d 0x26b8 0xd764e 0x37a73 0x37ce2 0x37ea8 0x3ed9a 0xfbe6 0x108a6 0x1f743 0x201f8 0x13aa9 0x12a4fa9 0x138e1c5 0x12f3022 0x12f190a 0x12f0db4 0x12f0ccb 0x102a7 0x11a9b 0x2238 0x2195 0x1)
terminate called throwing an exception

person Dinesh Raja    schedule 27.12.2011    source источник


Ответы (2)


Кажется, у вас есть несколько ошибок в вашем коде.

Изменяемая строка xmlString неправильно инициализирована в строке:

xmlString = [NSMutableString alloc]; // wrong

Это должно выглядеть так: xmlString = [[NSMutableString alloc] initWithCapacity:X];.

Кроме того, когда синтаксический анализатор находит символы, вы заменяете всю существующую изменяемую строку вместо того, чтобы добавлять их к существующему содержимому, или пытаетесь это сделать, потому что, согласно коду, вы просто сравниваете адрес памяти и теряете результат (==).

// wrong
xmlString == (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Это должно выглядеть так:

[xmlString appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

Наконец, в didEndElement я не уверен, чего вы пытаетесь достичь, но вы добавляете ссылку на строковый объект в массив, а затем устанавливаете текст метки для отображения содержимого массива... до тех пор, пока изменяемый массив хорошо распределен и инициализирован (в чем я действительно не уверен), метка должна отображать как минимум содержимое массива. Но вы можете "сбросить" изменяемую строку ([xmlString setString:@""];) и не выделять ее для каждого элемента.

ИЗМЕНИТЬ :

attributeDict отображает имена атрибутов как ключи с их значениями. Я предполагаю, что к вашему значению атрибута можно получить доступ через [attributeDict objectForKey:@"myData"];.

person Community    schedule 27.12.2011
comment
[xmlString setString:@]; куда добавить эту строку .. Я добавил, что в моем code.check это правильно? - person Dinesh Raja; 27.12.2011
comment
добавьте это в didEndElement. см. мое редактирование для обработки атрибутов - person ; 27.12.2011
comment
хорошо, но setString должно быть написано после того, что вы делаете со строкой... также вы уверены, что у вас действительно есть изменяемая строка? - person ; 27.12.2011
comment
я уверен, что у меня есть изменяемая строка... я инициализирован в файле интерфейса... если я этого не сделаю, я получу ошибку... тогда что мне делать со строкой? (setString должен быть записан после того, как вы что-то сделаете со строкой) - person Dinesh Raja; 27.12.2011

Я предполагаю, что проблема в этой строке:

xmlString== (NSMutableString *)[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

Изменить == на =

Надеюсь, что это объяснение не требуется.

person LordTwaroog    schedule 27.12.2011