iphone: NSXMLParser не может определить специальную сущность HTML & - PullRequest
0 голосов
/ 16 февраля 2012

Я просто не могу заставить 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. Я видел много вопросов о Stack по этой проблеме, но ни один из них не помог, и я также прочитал документы Apple на NSXMLParser. Я что-то здесь упускаю?

Я собираюсь с iOS 5.0 на iPhone 4

Ответы [ 2 ]

2 голосов
/ 19 октября 2012

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

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

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

и метод синтаксического анализа: foundCharacters становится

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

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

0 голосов
/ 16 февраля 2012

Согласно документации 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
}
...