Синтаксический анализ XML - iPhone - PullRequest
0 голосов
/ 02 декабря 2010

Здравствуйте, я новичок в разработке для iPhone.Я создал одно приложение, которое использует данные из веб-службы.И все работает нормально, но у меня проблема с анализом.

Данные XML, которые я получаю от веб-службы:

<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">
<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  session_start() [<a href='function.session-start'>function.session-tart</a>]:
Cannot send session cookie - headers already sent by (output started at D:\xampp\htdocs\system    
\application\controllers\isignin.php:4)</p>
<p>Filename: libraries/session.php</p>
<p>Line Number: 146</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p> 
<p>Message:  session_start() [<a href='function.session-start'>function.session-start</a>]:      Cannot send session cache limiter - headers already sent (output started at D:\xampp\htdocs\6d\system    \application\controllers\isignin.php:4)</p>
<p>Filename: libraries/session.php</p>
<p>Line Number: 146</p>

</div><div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;">

<h4>A PHP Error was encountered</h4>

<p>Severity: Warning</p>
<p>Message:  Cannot modify header information - headers already sent by (output started at D:\xampp\htdocs\6d\system\application\controllers\isignin.php:4)</p>
<p>Filename: codeigniter/Common.php</p>
<p>Line Number: 360</p>

</div><?xml version="1.0" encoding="utf-8"?>
<xml><item>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;newblock&gt;&lt;name&gt;abcde
&lt;/name&gt;&lt;password&gt;12345678&lt;/password&gt;&lt;/newblock&gt;</item></xml>

Это то, что я вызываю из метода connectionDidFinishLoading:

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
      NSLog(@"DONE. Received Bytes: %d", [webData length]);


  if (xmlParser)
   {
    [xmlParser release];
  }    
   xmlParser = [[NSXMLParser alloc] initWithData: webData];
   [xmlParser setDelegate: self];
   [xmlParser setShouldResolveExternalEntities:YES];
   [xmlParser parse];



   [connection release];
   [webData release];
}

Используются следующие методы анализа:

-(void) parser:(NSXMLParser *) parser 
 didStartElement:(NSString *) elementName 
   namespaceURI:(NSString *) namespaceURI 
 qualifiedName:(NSString *) qName
 attributes:(NSDictionary *) attributeDict {

 if( [elementName isEqualToString:@"GetWeatherResult"])
{
  if (!soapResults)
{
 soapResults = [[NSMutableString alloc] init];
}
elementFound = YES;
}
  }

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string
{
if (elementFound)
{
    [soapResults appendString: string];
}
}

-(void)parser:(NSXMLParser *)parser 
 didEndElement:(NSString *)elementName 
 namespaceURI:(NSString *)namespaceURI 
 qualifiedName:(NSString *)qName
  {
  if ([elementName isEqualToString:@"GetWeatherResult"])
  {
    //---displays the country---
    NSLog(soapResults);        
    UIAlertView *alert = [[UIAlertView alloc] 
     initWithTitle:@"Current Temperature!"                           
     message:soapResults 
     delegate:self  
     cancelButtonTitle:@"OK" 
     otherButtonTitles:nil];
    [alert show];
    [alert release];
    [soapResults setString:@""];
    elementFound = FALSE; 
}
}

Мой запрос: я хочу извлечь тег "name" со значением "abcde" из полученных данных XML.
Но когда я ищу " name " со значением " abcde " в полученных выше xml-данных, парсер не может найтиэто из-за & qt, <</strong> и т. д.

1) Как исправить мои NSMutableData, чтобы иметь нормальные значения (<,> и т.д.)?Любые встроенные функции NSMutableData для замены <,> на <,> ?Или
2) Что-то пропущено (или неправильно) при создании XML-данных на стороне сервера, или я что-то упускаю при синтаксическом анализе на стороне клиента (на iPhone) Или
3) Любое другое решениеисправить вышеуказанную проблему.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Попробуйте: -

 [string stringByReplacingOccurrencesOfString:@"&lt" withString:@"<"];
0 голосов
/ 02 декабря 2010

Я бы порекомендовал вам использовать библиотеку TBXML, она очень маленькая и имеет очень хорошую производительность. Это также довольно легко понять, по крайней мере, легче, чем NSXMLParser, IMHO.

  1. В Objective C. нет встроенной функции для замены & lt & gt. Поэтому вы можете захотеть обернуть эту строку на сервере.
...