Я настроил синтаксический анализатор, который использует веб-службу asmx, а .NET создает закрывающий тег элемента.Вот клип из журнала:
<Name>This is the Name</Name>
<EmptyString1 />
<EmptyString2 />
<Name2>This is Name2</Name2>
Когда я добираюсь до метода foundCharacters, найденных символов нет, а пустой элемент заполняется самыми последними найденными символами.
Например, строка для и это «Это имя», когда я хочу, чтобы это была пустая строка или возвращала строку, которая говорит «N / A».
Это выглядит какNSXMLparser не поддерживает этот тип конечного тега, так как он просто пропускает его.Вы могли бы подумать, что его можно будет перехватить в методе didEndElement, но он никогда не попадет туда, потому что он не видит его, когда косая черта находится в конце, а не в конце.
Как я могу сказать парсеру возвращать строку, когдаон попадает в эту форму конечного тега?
РЕДАКТИРОВАТЬ: Вот еще немного из моего кода.В моем понимании, по большей части, я уже делаю то, что предлагает NJones, поэтому я должен сосредоточиться на этом вопросе больше в этой ситуации ...
установив объект NSMutableData в 0 очистить его
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[webData setLength:0];
}
webData устанавливается из мыльного вызова веб-службы, а затем заносится в журнал в виде строки, чтобы я мог видеть, как выглядит результат (так же, как для NJones "stringToParse" за исключениеммыльные заголовки включены), затем webData отправляется в синтаксический анализатор.
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[webData appendData:data];
NSString *soapResponse = [[NSString alloc] initWithData:webData encoding:NSASCIIStringEncoding];
NSLog(@"webData: %@",soapResponse);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if (xmlParser)
{
[xmlParser release];
}
xmlParser = [[NSXMLParser alloc] initWithData:webData];
[xmlParser setDelegate:self];
[xmlParser setShouldProcessNamespaces:YES];
[xmlParser parse];
[connection release];
[webData release];
}
это внутри didStartElement, внутри тега "File", то есть тега "WebServiceResult", который анализирует все элементы
if ([elementName isEqualToString:@"WebServiceResult"])
{
if(!soapResults)
{
soapResults = [[NSMutableString alloc] init]; //declared in .h
}
recordResults = YES;
}
ниже, когда я нахожусь в главном родительском теге (WebServiceResult), результаты записи теперь устанавливаются в YES, поэтому он переходит в foundCharacters и устанавливает строку в @ "", затем пытается добавить
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string
{
if (recordResults)
{
if ([string isEqualToString:@""] || string == nil) {
[soapResults appendString:@"N/A"];
NSLog(@"foundResults empty: %@",soapResults);
}
else {
[soapResults setString:@""];
[soapResults appendString: string];
NSLog(@"foundResults: %@",soapResults);
}
}
}
внутри метода didEndElement, важно отметить, что "EmptyString1" иногда НЕ ПУСТО , поэтому вы не можете установить элемент EmptyString в @ "" без ifзаявление где-то вроде, как в методе foundCharacters выше.Затем webData отправляется в синтаксический анализатор
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"Name"])
{
name = [NSString stringWithFormat:@"%@",soapResults];
NSLog(@"Name: %@",name);
}
if ([elementName isEqualToString:@"EmptyString1"])
{
sometimesEmptyString = [NSString stringWithFormat:@"%@",soapResults];
NSLog(@"EmptyString1: %@",sometimesEmptyString);
}
//...and the same goes for sometimesEmptyString2, and name2...
}
Таким образом, в итоге, журнал не попадает в "foundCharacters empty" if с помощью [string isEqualToString: @ ""], потому что он никогда не входит в метод foundCharactersкогда есть пустой тег элемента.Это просто для пояснения, и я не уверен, как добавить @ "", если парсер вообще не видит пустой элемент ... кто-то увидит, что мне не хватает, и я уверен, что этопростое исправление здесь