NSXMLparser: как вернуть строку, если есть пустой тег элемента (<foo />) - PullRequest
0 голосов
/ 25 января 2012

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

1 Ответ

0 голосов
/ 26 января 2012

Ух ... супер легко исправить, но я понял ...

это изменение, необходимое для метода foundCharacters

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

    if (string != nil) {
        [soapResults setString:@""];
        [soapResults appendString: string];
        NSLog(@"foundResults: %@",soapResults);
    }

}

, а затем я добавил этот простой кусокto didEndElement в самом конце

[soapMessage setString:@"N/A"];

Для этого устанавливается soapMessage в значение @ "N / A", поэтому при обнаружении пропущенного foundCharacters soapMessage сохраняет значение @ "N / A" и, если оно найденоCharacters,он очищает независимо от того, что это такое, и добавляет строку в soapMessage, чтобы его можно было установить в didEndElement.Так что действительно, строка должна быть установлена ​​на то, что вы хотите в конце didEndElement, а не в didStartElement для моего конкретного случая.

...