#iphone #objective-c #xml #nsxmlparser
#iPhone #objective-c #xml #nsxmlparser
Вопрос:
Я пытаюсь проанализировать некоторый XML с помощью NSXMLParser
на iPhone.
Когда я определяю нужный мне элемент, я хотел бы, чтобы между начальным элементом и конечным элементом было все как есть.
Например, учитывая:
<A>
<K>
<C>
<D>dddd</D>
</C>
<E> eeee </E>
</K>
<F> ffff </f>
</A>
Я хотел бы указать K
И получение:
<C>
<D> dddd </D>
</C>
<E> eeee </E>
Однако в настоящее время NSXMLParser игнорирует все атрибуты <
, >
и.
Что мне добавить в методы делегирования, чтобы убедиться, что я получаю все, что находится между указанными мной тегами?
Вот что у меня есть прямо сейчас:
//---when the start of an element is found---
-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict {
if( [elementName isEqualToString:@"ns11:createNewPrincipalResponse"])
{
elementFound = YES;
NSLog(@"PrincResp FOUND");
}
}
-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string
{
if (elementFound)
{
[parseResults appendString: string];
}
}
//---when the end of element is found---
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
if ([elementName isEqualToString:@"ns11:createNewPrincipalResponse"])
{
//---displays the country---
NSLog(@"n******************nParse Results...n*************nn%@",parseResults);
[parseResults setString:@""];
token = [NSString stringWithString:parseResults];
elementFound = FALSE;
}
}
Заранее спасибо!
Ответ №1:
Вероятно, вы можете использовать методы анализатора ColumnNumber, lineNumber, чтобы получить местоположение, с которого начинается ваш элемент (т. Е. Сохранить их как column1, line1 в didStartElement для элемента, который вы ищете), затем, когда этот элемент заканчивается, в didEndElement снова получите column2 и line2, а затем просто вырежьте текст из исходного XML из (line1, column1) в (line2, column2).
Довольно банально, но, вероятно, сработает.
Редактировать: для извлечения текста вы могли бы сделать что-то в этом роде:
__block int lineNumber = 0;
__block NSMutableString* result = [NSMutableString stringWithCapacity:100];
[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) {
if(lineNumber == line1) {
[result appendString:[line substringFromIndex:column1]];
}
if(lineNumber > line1 amp;amp; lineNumber < line2) [result appendString:line];
if(lineNumber == line2) {
[result appendString:[line substringToIndex:column2]];
}
lineNumber ;
if(lineNumber > line2) *stop = YES;
}];
Я не знаю, находится ли позиция синтаксического анализатора при запуске / завершении элемента в начале или в конце этого элемента — возможно, вам придется либо пропустить это самостоятельно, либо, если позиция находится в конце элемента, проверить, не находятся ли column1 / column2 за пределами строки (в этом случае просто ничего не добавляйте). Кроме того, если вам нужно сохранить символы новой строки, вам нужно будет добавить их самостоятельно (вместо appendString:str используйте AppendFormat:»%@n», str)
Комментарии:
1. Хорошо, я успешно получил номера столбцов и строк, есть идеи, какой метод я мог бы использовать для извлечения подстроки из определенного столбца и строки в другой столбец и строку?
2. Спасибо. Ваш код делает свое дело. Однако номера столбцов и строк, возвращаемые анализатором, или неправильные индексы:(. Возможно, это как-то связано с тем, что входные данные для анализатора являются данными, тогда как приведенный выше код работает со строками.
3. Да, потому что номер столбца относится к уровню вложенности, а не к фактической строке в тексте, извините, моя ошибка. Если номер строки тоже неверен, то, я думаю, вам, возможно, придется попробовать другие анализаторы, как предлагают другие… Или, если вам нужно только получить текст между двумя тегами, то, возможно, вам вообще не нужен анализатор XML, просто выполните сопоставление регулярных выражений?
4. Спасибо, добрый сэр. Я был слишком узколоб, чтобы понять, что регулярное выражение — это все, что мне было нужно. RegexKitLite, похоже, является одной из самых простых библиотек (iOS, похоже, не может обрабатывать регулярные выражения самостоятельно).
5. пожалуйста. Кстати, в iOS действительно есть поддержка регулярных выражений — ознакомьтесь с NSRegularExpression (хотя она доступна только с iOS 4.0, поэтому, если вам нужна поддержка более ранних версий, то подойдет сторонний компонент).