Операции по замене строк в цели c - PullRequest
0 голосов
/ 01 марта 2012

Я получил результат в виде

<ZmaterialGroupList><Matkl>001</Matkl><Text>Metal processing</Text></ZmaterialGroupList>

Мне нужно получить результат как 001 Обработка металла, когда я применяю функцию замены строк, это дает исключение.

Добавлен код из комментария:

for(int i=0; i<[soapArray.items count]; i++) {
    NSString *str = [soapArray.items objectAtIndex:i];
    str = [str stringByReplacingOccurrencesOfString:@"<Matkl>" withString:@""];
}

Таким образом, я написал, но получил исключение, как Неверный аргумент передается по адресу str

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Вы могли бы лучше использовать 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];
0 голосов
/ 01 марта 2012

Рассмотрите возможность использования анализатора XML, или вы можете использовать NSScanner:

Пример:

NSString *wanted;
NSString *fullMessage;
NSString *xml = @"<ZmaterialGroupList><Matkl>001</Matkl><Text>Metal processing</Text></ZmaterialGroupList>";
NSScanner *scanner = [NSScanner scannerWithString:xml];

[scanner scanUpToString:@"<Matkl>" intoString:nil];
[scanner scanString:@"<Matkl>" intoString:nil];
[scanner scanUpToString:@"</Matkl>" intoString:&wanted];
fullMessage = wanted;

[scanner scanUpToString:@"<Text>" intoString:nil];
[scanner scanString:@"<Text>" intoString:nil];
[scanner scanUpToString:@"</Text>" intoString:&wanted];
fullMessage = [fullMessage stringByAppendingFormat:@" %@", wanted];

NSLog(@"fullMessage: '%@'", fullMessage);

Вывод NSLog:
fullMessage: '001 Обработка металла'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...