Анализ результатов SOAP с использованием TouchXML в iOS SDK (iPad) - PullRequest
1 голос
/ 25 января 2011

Я работаю над проектом iPad, использующим функции в WebService. Обработка webservice соединения, данные и т. Д. Работы найти. Но я не могу проанализировать результат SOAP с помощью TouchXML. Получение узлов из xml всегда возвращает длину 0.

Вывод xml:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" <br>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br>xmlns:xsd="http://www.w3.org/2001/XMLSchema"><br><br>    <soap:Body><br>        <LogOnResponse xmlns="http://coreservices.org/v1"><br>            <LogOnResult><br>                <Id>1c0e9ad0-a3be-4cd0-8f0d-0616a63a4e28</Id><br>                <userId>2</userId><br>                <user><br>                    <ID>2<br>                    <Name>Beheerder<br>                    <emailAddress /><br>                    <cultureName>nl-NL</cultureName><br>                </user><br>            </LogOnResult><br>        </LogOnResponse><br>    </soap:Body><br></soap:Envelope>

код парсера:


 NSData *aData = [[NSData alloc] initWithBytes:[webData mutableBytes]<br>                                        length:[webData length]];

 NSString *xmlData = [[NSString alloc] initWithData:aData <br>                                           encoding:NSASCIIStringEncoding];

 NSLog(@"%@", xmlData);

 [xmlData release];

 CXMLDocument *domUserIdentity = [[[CXMLDocument alloc] initWithData:aData <br>                                                             options:0 <br>                                                               error:nil]<br>                                                                autorelease];
 [aData release];

 NSArray *nodesList = [domUserIdentity nodesForXPath:@"//LogOnResult" error:nil]; // 0 length

    for (CXMLElement *resultElement in nodesList) {
        for (int counter = 0; counter 
            NSString *elemName = [[resultElement childAtIndex:counter] name];
            NSString * elemValue = [[[resultElement childAtIndex:counter]<br>                                                             stringValue] <br>                                        stringByTrimmingCharactersInSet:<br>                        [NSCharacterSet whitespaceAndNewlineCharacterSet]];

   [elemName release];
   [elemValue release];
  }
}

 [nodesList release];

Есть идеи, что я сделал не так?

Большое спасибо заранее.

Inoel

Ответы [ 2 ]

1 голос
/ 25 января 2011

Я рекомендую использовать XPath Parser. Вы не делаете ничего слишком тяжелого, поэтому скорость удара составляет хорошо . Мой личный выбор - TFHpple . Есть немного более быстрые и более точные решения, но я считаю, что простоту TFHpple трудно превзойти.

Пример:

NSData *data = [[NSData alloc] initWithContentsOfFile:@"example.html"]; <br>
// Create parser
xpathParser = [[TFHpple alloc] initWithXMLData:data];<br>
NSArray *elements = [xpathParser search:@"//LogOnResult"];<Br>
TFHppleElement *element = [elements objectAtIndex:0];<br>
// Get the text within the cell tag
NSString *content = [element content];<br>
[xpathParser release];
[data release];

Очевидно, вам нужно написать код, чтобы сохранить нужные вам части. Глядя на эти данные, я бы, вероятно, создал собственный класс держателей данных, к которому вы могли бы обращаться через свойства. Вы можете проанализировать ваш XML в этом и затем сохранить его как свойство в контроллере представления, который будет обращаться к нему.

Удачного кодирования!

1 голос
/ 25 января 2011

Попробуйте использовать NSXMLDocument, он должен работать так же, как CXMLDocument.Вот несколько документов: ссылка

...