iphone: NSXMLParser не может идентифицировать специальный объект HTML

Я просто не могу заставить NSXMLParser распознавать &

вот мой XML:

 <?xml version="1.1" encoding="UTF-8"?>
 <root>
     <myURL>http://www.mywebsite.com/info?id=32&amp;page=5</myURL>>
 </root>

Вот мой код разбора:

-(void)getXml {
 NSURL *xmlurl = [[NSURL alloc] initWithString:@"http://www.mywebsite.com/myxml.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlurl];
[xmlParser setDelegate:self];
[xmlParser parse];
[xmlParser release];
[dataurl release];
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {

NSLog(@"Parser Error: %@", parseError);

}

 - (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validError {

NSLog(@"Parser validation Error: %@", validError);


}


- (void)parserDidStartDocument:(NSXMLParser *)parser {

NSLog(@"Parser started");


}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{

NSLog(@"Found key: %@", elementName);


}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

NSLog(@"Found Element: %@", string);


}


- (void)parserDidEndDocument:(NSXMLParser *)parser {

NSLog("done"):

}

Вот мой результат:

 Found key: root
 Found key: myURL
 Found element: http://www.mywebsite.com/info?id=32
 Found element: page=5
 Found element: 
 Found key: myURL

Парсер не распознает & правильно и разделяет мой URL. Я видел много вопросов о стеке по этой проблеме, но ни один из них не помог, и я также прочитал документы Apple на NSXMLParser. Я что-то упустил здесь?

Я строю с iOS 5.0 на iPhone 4


person Zigglzworth    schedule 15.02.2012    source источник


Ответы (2)


Согласно документация NSXMLParserDelegate:

Объект синтаксического анализатора может отправить делегату несколько сообщений parser:foundCharacters: для сообщения о символах элемента. Поскольку строка может быть только частью общего содержимого символов для текущего элемента, вы должны добавлять ее к текущему набору символов до тех пор, пока элемент не изменится.

Таким образом, обычный шаблон использования состоит в том, чтобы продолжать добавлять временную строку до тех пор, пока не будет достигнут конец элемента:

.h

@property (nonatomic,retain) NSMutableString *tempString;

.m

@synthesize tempString;

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    self.tempString = @"";
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    [self.tempString appendString:string];
}

- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    // do something with self.tempString
}
person jonkroll    schedule 15.02.2012

Спасибо, это отличное понимание процесса парсера, но были проблемы с его использованием, возможно, из-за особенностей Xcode 4.5.1.

Оказалось, что присвоение NSString типа @"" NSMutableString делает его неизменяемым. Вместо того, чтобы установить начальное значение для tempString, мне пришлось использовать

self.tempString = [[NSMutableString alloc] initWithString: @""];

и метод parser:foundCharacters становится

 - (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
[self.tempString  appendString:string];
currentNodeContent = (NSMutableString*) [self.tempString stringByTrimmingCharactersInSet:    [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

Но это одна проблема решена. Спасибо.

person johnlholden    schedule 19.10.2012
comment
что такое текущийNodeContent? - person Rishabh Tayal; 16.02.2013