Вы могли бы лучше использовать NSXMLParser
вместо того, чтобы пытаться заменить фрагменты XML.
Если вы обновите свой вопрос, включив в него немного больше объяснения вашего кода (в частности,код, который работает с soapArray), я должен быть в состоянии объяснить немного больше, почему ваш код не работает как есть.
Использование NSXMLParser
Важно помнить, чтоNSXMLParser просто читает данные, которые вы предоставляете, последовательно, он не использует структуру DOM.
Настройка
Прежде всего вам нужно дать парсеру что-то для анализа!В моем примере я получаю ресурс из пакета и преобразую его в NSData.Однако есть и другой вариант initWithContentsOfURL
.Убедитесь, что вы не забыли установить свой делегат!
-(void) parse
{
NSString *file = @"myXMLFile.xml";
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[file stringByDeletingPathExtension] ofType:[file pathExtension]]];
//If you already have a string:
//NSData* data=[xmlString dataUsingEncoding:NSUTF8StringEncoding];
if (data.length == 0)
{
//No data
return nil;
}
...
}
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
Парсинг
-(void) parserDidStartDocument:(NSXMLParser *)parser
{
//Here you set up any variables you might need while parsing
}
-(void) parserDidEndDocument:(NSXMLParser *)parser
{
//I usually don't have to do anything here but you might need to release some variables here for example.
}
-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
//Here is where the bulk of the parsing is done if you are using attributes. I prefer to use attributes as it looks cleaner both in the XML file and the parser.
if ([elementName isEqualToString:@"element1"])
{
//Just an example of what you might want to do
int index = [[attributeDict valueForKey:@"attribute1"] intValue];
NSString *name = [attributeDict valueForKey:@"n"];
[exampleDictionary setValue:name forKey:[NSString stringWithFormat:@"%d", index]];
}
if ([elementName isEqualToString:@"element2"])
{
//We need to know that the next piece of information (from foundCharacters) is for element 2
currentElement = ELEMENT_2;
}
}
//If you haven't used attributes you might find that you have a lot of parsing to do here instead.
-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
//Check what this info is for?
if(currentElement == ELEMENT_2)
{
element2Data = [NSString stringWithString:string];
}
}
-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"element2"])
{
myObject.somethingThatNeedsElement2 = element2;
}
}
Завершение
После окончания неплохо проверить, что ничего не пошло не таки освободить память парсера.Итак, в вашем методе parse
добавьте это после вызова [parser parse]
.
if ([parser parserError] != nil)
{
[[[[UIAlertView alloc] initWithTitle:@"Error parsing XML" message:[[parser parserError] localizedDescription] delegate:nil cancelButtonTitle:@"Done" otherButtonTitles:nil] autorelease] show];
}
[parser release];