Невозможно выполнить синтаксический анализ с использованием TouchXML - PullRequest
0 голосов
/ 26 сентября 2011

Я не могу проанализировать получение ответа с помощью Touch XML Мой ответ от SOAP

    <CXMLDocument 0x4b30110 [0x4b34c90]> <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetImagesResponse xmlns="http://tempuri.org/">
      <GetImagesResult>;http://www.google.com;http://www.hotmail.com;http://www.yahoo.com</GetImagesResult>
    </GetImagesResponse>
  </soap:Body>
</soap:Envelope>

/// Функция Touch XML

    -(void) grabRSSFeed:(NSData *)responseData {

    // Initialize the blogEntries MutableArray that we declared in the header
    self.rssEntries = [[[NSMutableArray alloc] init] autorelease];

    // Create a new rssParser object based on the TouchXML "CXMLDocument" class, this is the
    // object that actually grabs and processes the RSS data

    CXMLDocument *rssParser = [[CXMLDocument alloc] initWithData:responseData options:0 error:nil];
    //CXMLDocument *rssParser = [[CXMLDocument alloc] initWithContentsOfURL:url options:0 error:nil];

    NSLog(@"rssParser %@",rssParser);
    //NSLog(@"url %@",url);

    // Create a new Array object to be used with the looping of the results from the rssParser
    NSArray *resultNodes = NULL;

    // Set the resultNodes Array to contain an object for every instance of an  node in our RSS feed
    resultNodes = [rssParser nodesForXPath:@"//GetImagesResult" error:nil];

    // Loop through the resultNodes to access each items actual data
    for (CXMLElement *resultElement in resultNodes) {

        // Create a temporary MutableDictionary to store the items fields in, which will eventually end up in blogEntries
        NSMutableDictionary *blogItem = [[[NSMutableDictionary alloc] init] autorelease];

        // Create a counter variable as type "int"
        int counter;

        // Loop through the children of the current  node
        for(counter = 0; counter < [resultElement childCount]; counter++) {

            //[resultElement initWithXMLString:@""];
            NSString *strValue = [[resultElement childAtIndex:counter] stringValue];
            //strValue = [strValue stringByReplacingOccurrencesOfString:@"\n" withString:@""];
            NSString *strName = [[resultElement childAtIndex:counter] name];

            if ([resultNodes containsObject:@""] || resultNodes == nil || resultElement == nil || [resultElement isEqual:@""] || [resultElement children] == nil) {

                NSLog(@"Null Object");
            }
            else {

                if (strValue && strName) {

                    // Add each field to the blogItem Dictionary with the node name as key and node value as the value
                    [blogItem setObject:[[resultElement childAtIndex:counter] stringValue] forKey:[[resultElement childAtIndex:counter] name]];
                }
            }
        }

        // Add the blogItem to the global blogEntries Array so that the view can access it.
        [self.rssEntries addObject:[blogItem copy]];

        NSLog(@"RSS Entries %@",self.rssEntries);
    }

    [[rssParser retain] release];
}

1 Ответ

2 голосов
/ 26 сентября 2011

Быть "не в состоянии разобрать ответ" - очень расплывчатое описание вашей проблемы.Однако на первый взгляд я заметил, что этот запрос XPath ...

resultNodes = [rssParser nodesForXPath:@"//GetImagesResult" error:nil];

..., скорее всего, не соответствует ни одному элементу и, следовательно, возвращает пустой массив.

Почему? Ваш XML имеет пространство имен .Используйте метод nodesForXPath:namespaceMappings:error: вместо nodesForXPath:error:.У первого есть дополнительный параметр, который позволяет вам предоставить словарь отображения пространства имен.Затем отредактируйте ваш запрос XPath соответствующим образом.См. Пример ниже:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      @"http://tempuri.org/",
                      @"tempuri", 
                      nil];

// Set the resultNodes Array to contain an object for every instance of an  node in our RSS feed
resultNodes = [rssParser nodesForXPath:@"//tempuri:GetImagesResult" namespaceMappings:dict error:nil];

Кроме того, последнее утверждение метода является бессмысленным:

[[rssParser retain] release];

Чтобы сбалансировать alloc-init, оно должно быть:*

[rssParser release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...