iPhone - Найти и заменить несколько вхождений тегов и содержимого из строки регулярными выражениями - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть файл (скажем, изменяемая строка) с несколькими тегами, подобными этому:

<Tag><minitag>40.23,12.7</minitag></Tag>

И я хотел бы заменить каждый следующим:

<Title>some hard text</Title><Value>40.23</Value><Title>some other hard text</Title><Value>12.7</Value>

с использованием [xmlString replaceOccurrencesOfString:@"???????" withString:@"???????" options:NSRegularExpressionSearch range:NSMakeRange(0, [xmlString length])];
Или любой другой метод, если этот не может достичь этой цели за пару минут .

Конечно, файл содержит много других вещей, чисел, запятых, ...

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 17 сентября 2011

Возможность перезаписи xml через пару минут будет зависеть от размера xml, но время вычисления составляет пару минут.

Я не думаю, что вы достигнете этого с помощью простой замены строк. Я думаю, что вам нужно будет проанализировать xml и, когда он разбирается, вам нужно разбить строку (разделить на запятые и т. Д.) И параллельно записывать новый xml документ в нужном вам формате.

Вот быстрый пример разбора строки, которую вы имели. Конечно, если на самом деле все сложнее, пользовательский разбор строк становится более сложным:

- (void) DoWork
{
    NSString *xmlSource = @"<Tag><minitag>40.23,12.7</minitag></Tag>";
    NSData *data = [xmlSource dataUsingEncoding:NSUTF8StringEncoding];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    [parser setDelegate:self];
    [parser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName caseInsensitiveCompare:@"minitag"] == NSOrderedSame)
    {
        NSLog(@"minitag");
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"chars:%@", string);
    NSArray *components = [string componentsSeparatedByString:@","];
    for (NSString *comp in components)
    {
        NSLog(@"comp:%@", comp);

        // This outputs:
        // minitag
        // chars:40.23,12.7
        // comp:40.23
        // comp:12.7    

        //
        // At this point, you have the parts parsed, maintain an NSXmlDocument 
        // (or other xml writer)
        // that you are writing to as you're parsing this
        // Add your constant string elements and your sub data elements as you go
        //
    }
}
0 голосов
/ 17 сентября 2011

Нашли:

[xmlString replaceOccurrencesOfString:@"<Tag><miniTag>([0-9.-]*){1},([0-9.-]*){1}</miniTag></Tag>" withString:@"<Title>Some hard text</Title><Value>$1</Value><Title>Some other hard text</Title><Value>$2</Value>" options:NSRegularExpressionSearch range:NSMakeRange(0, [xmlString length])];
0 голосов
/ 17 сентября 2011

Не знаю о регулярных выражениях, самый эффективный способ, который я могу видеть, - проанализировать xml, чтобы извлечь числа, после того, как он создаст новое и поместит числа там.

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