无法解析在iphone中获取数据的web服务 [英] Not able to parse webservices getting data in iphone

查看:81
本文介绍了无法解析在iphone中获取数据的web服务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是手机编程的新手。使用下面的代码我收到回复表格webservice

I am new to i phone programming.Using below code i getting response form webservice

NSString *soapMessage=[NSString stringWithFormat:
                           @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                           "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
                           "<soap:Body>\n"

                           "<OnlineStatus xmlns=\"http://tempuri.org/\">\n"
                           "<CafeName>Cyber Cafe Name</CafeName>\n"
                           "<FromDate>2012-03-01</FromDate>\n"
                           "<ToDate>2013-05-03</ToDate></OnlineStatus>\n"
                           "</soap:Body>\n"

                           "</soap:Envelope>"];
    NSLog(@"%@",soapMessage);

    NSURL *url = [NSURL URLWithString:@"http://www.ebidmanagerdemo.com/gjHouseOnline/xml/XMLDataService.asmx"];
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
    [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [theRequest addValue: @"http://tempuri.org/OnlineStatus" forHTTPHeaderField:@"Soapaction"];
    [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
    [theRequest setHTTPMethod:@"POST"];
    [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
    NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

    if(theConnection) {
        webData = [NSMutableData data];
    }
    else {
        NSLog(@"theConnection is NULL");

    NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
    NSLog(@"%@",msgLength);
       }

}

我收到以下格式的回复

2013-05-27 13:55:10.028 NewC Newcafezee[1191:11303] <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<OnlineStatus xmlns="http://tempuri.org/">
<CafeName>Cyber Cafe Name</CafeName>
<FromDate>2012-03-01</FromDate>
<ToDate>2013-05-03</ToDate></OnlineStatus>
</soap:Body>
</soap:Envelope>
2013-05-27 13:55:13.170 NewC Newcafezee[1191:11303] DONE. Received Bytes: 18345
2013-05-27 13:55:13.170 NewC Newcafezee[1191:11303]  getting in xml <?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><OnlineStatusResponse xmlns="http://tempuri.org/"><OnlineStatusResult>&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;DataSet&gt;
  &lt;xs:schema id="Result" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"&gt;
    &lt;xs:element name="Result" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"&gt;
      &lt;xs:complexType&gt;
        &lt;xs:choice minOccurs="0" maxOccurs="unbounded"&gt;
          &lt;xs:element name="Table"&gt;
            &lt;xs:complexType&gt;
              &lt;xs:sequence&gt;
                &lt;xs:element name="SystemDateTime" type="xs:dateTime" minOccurs="0" /&gt;
                &lt;xs:element name="CafeDateTime" type="xs:dateTime" minOccurs="0" /&gt;
                &lt;xs:element name="LicenseNumber" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="MachineIP" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="TotalClients" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="IdleClients" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="BusyClients" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="DummyIdle" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="DummyBusy" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="PCUsageSessions" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="PCUsageMinutes" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="SessionMessage" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="CreatedBy" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="CreatedDate" type="xs:dateTime" minOccurs="0" /&gt;
                &lt;xs:element name="Cybercafe" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="Email" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="AdminPassword" type="xs:string" minOccurs="0" /&gt;
                &lt;xs:element name="MajorVersion" type="xs:short" minOccurs="0" /&gt;
                &lt;xs:element name="MinorVersion" type="xs:short" minOccurs="0" /&gt;
                &lt;xs:element name="SalesAmount" type="xs:decimal" minOccurs="0" /&gt;
                &lt;xs:element name="PurchasesAmount" type="xs:decimal" minOccurs="0" /&gt;
                &lt;xs:element name="Revision" type="xs:int" minOccurs="0" /&gt;
                &lt;xs:element name="CZLicense" type="xs:string" minOccurs="0" /&gt;
              &lt;/xs:sequence&gt;
            &lt;/xs:complexType&gt;
          &lt;/xs:element&gt;
        &lt;/xs:choice&gt;
      &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;
  &lt;/xs:schema&gt;
  &lt;diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"&gt;
    &lt;Result&gt;
      &lt;Table diffgr:id="Table1" msdata:rowOrder="0"&gt;
        &lt;SystemDateTime&gt;2012-09-20T00:00:00-06:00&lt;/SystemDateTime&gt;
        &lt;CafeDateTime&gt;2012-09-18T11:01:54-06:00&lt;/CafeDateTime&gt;
        &lt;LicenseNumber&gt;cc&lt;/LicenseNumber&gt;
        &lt;MachineIP&gt;192.168.13.167&lt;/MachineIP&gt;
        &lt;TotalClients&gt;0&lt;/TotalClients&gt;
        &lt;IdleClients&gt;0&lt;/IdleClients&gt;
        &lt;BusyClients&gt;0&lt;/BusyClients&gt;
        &lt;DummyIdle&gt;0&lt;/DummyIdle&gt;
        &lt;DummyBusy&gt;0&lt;/DummyBusy&gt;
        &lt;PCUsageSessions&gt;0&lt;/PCUsageSessions&gt;
        &lt;PCUsageMinutes&gt;0&lt;/PCUsageMinutes&gt;
        &lt;SessionMessage&gt;LVCLPRLbSCTC&lt;/SessionMessage&gt;
        &lt;CreatedBy&gt;1&lt;/CreatedBy&gt;
        &lt;CreatedDate&gt;2012-09-20T00:00:00-06:00&lt;/CreatedDate&gt;
        &lt;Cybercafe&gt;Cyber Cafe Name&lt;/Cybercafe&gt;
        &lt;Email&gt;YOURMAIL@CAFE.COM&lt;/Email&gt;
        &lt;AdminPassword&gt;admin1&lt;/AdminPassword&gt;
        &lt;MajorVersion&gt;1&lt;/MajorVersion&gt;
        &lt;MinorVersion&gt;0&lt;/MinorVersion&gt;
        &lt;SalesAmount&gt;0.0000&lt;/SalesAmount&gt;
        &lt;PurchasesAmount&gt;0.0000&lt;/PurchasesAmount&gt;
        &lt;Revision&gt;0&lt;/Revision&gt;
        &lt;CZLicense /&gt;
      &lt;/Table&gt;
  &lt;/Result&gt;
  &lt;/diffgr:diffgram&gt;
&lt;/DataSet&gt;</OnlineStatusResult></OnlineStatusResponse></soap:Body></soap:Envelope>

我没有得到标签末尾的& lt和& gt。我不是在此响应中获取开始标记和结束标记。还在xml中

I am not getting what is &lt and &gt at end of tag.I am not getting start tag and end tag in this response.and also in xml

并在下面的代码中使用我正在尝试解析数据,但这里它的加载数据不在 NSXMLParser

And usign below code i am trying parse data but here its not loading data in NSXMLParser

  -(void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
        NSLog(@"DONE. Received Bytes: %d", [webData length]);
        NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
        NSLog(@" getting in xml %@",theXML);    
        xmlParser = [[NSXMLParser alloc]initWithData:webData];
        [xmlParser setDelegate: self];
        [xmlParser setShouldResolveExternalEntities: YES];  
        [xmlParser parse];

        NSLog(@" iiiiii %@",xmlParser);

       }

它在 NSXMLParser中显示就像它下面的空。我想用开始和结束元素解析数据。

Its show in NSXMLParser like below its empty.I want to parse data using start and end elements.

2013-05-27 13:55:13.179 NewC Newcafezee[1191:11303]  iiiiii <NSXMLParser: 0x71c7060>


推荐答案

NSXMLParser 不会为你解析数据到 NSDictionary ,它会循环遍历所有元素,你需要使用你需要的值来获取它的委托( NSXMLParserDelegate )。

NSXMLParser doesn't parse the data into a NSDictionary for you, it'll loop through all the elements, and you'll need to get the values that you need using its delegate (NSXMLParserDelegate).

有框架,例如 XMLReader (实际上使用 NSXMLParser ),用于处理将所有元素解析为 NSDictionary NSArray (取决于格式化xml的方式)。

There are frameworks, such as XMLReader (which actually uses NSXMLParser), that handles the parsing of all elements into a NSDictionary or NSArray (depending on how the xml is formatted).

NSLog(@iiiiii%@,xmlParser); 将显示 NSXMLParser 对象的描述,以及正确输出(它不应该显示解析的内容)。

NSLog(@" iiiiii %@",xmlParser); will show the description of a NSXMLParser object, and outputs correctly (it's not supposed to show the parsed content).

关于& 字符,这些字符是编码的 HTML字符。服务器上可能存在问题,因为它返回部分xml编码,部分解码。

Regarding the & characters, those are encoded html characters. There may be an issue on the server, since it returns part of the xml encoded, and part of it decoded.

编辑:

这需要在NSString类别中添加,然后您可以从服务器响应中对字符串调用此方法。

This needs to be added in a NSString category, and you can afterwards call this method on your string from the server response.

-(NSString *)xmlDecodedString{
    NSMutableString *ret = [[NSMutableString alloc] initWithCapacity:self.length];
    NSRange specialRange = NSMakeRange(NSNotFound, NSNotFound);
    // using %c causes some issues
    NSRange decRange = NSMakeRange(0, NSNotFound);
    for (NSUInteger i=0; i<[self length]; i++) {
        char c = [self characterAtIndex:i];
        if (specialRange.location==NSNotFound) {
            // search for the start of a special 'character' (starts with '&')
            if (c == '&'){
                if (i>decRange.location) {
                    decRange.length=i-decRange.location;
                    [ret appendString:[self substringWithRange:decRange]];
                    decRange = NSMakeRange(i+1, NSNotFound);
                }
                specialRange.location=i;
            }
        }
        else{
            // search for the end of the special 'character' (ends with ';')
            if (c == ';'){
                decRange = NSMakeRange(i+1, NSNotFound);
                specialRange.length=i-specialRange.location+1;
                NSString *special = [self substringWithRange:specialRange];
                specialRange = NSMakeRange(NSNotFound, NSNotFound);
                if ([special isEqualToString:@"&quot;"]) {
                    [ret appendString:@"\""];
                }
                else if([special isEqualToString:@"&#x27;"]){
                    [ret appendString:@"'"];
                }
                else if([special isEqualToString:@"&lt;"]){
                    [ret appendString:@"<"];
                }
                else if([special isEqualToString:@"&gt;"]){
                    [ret appendString:@">"];
                }
                else if([special isEqualToString:@"&amp;"]){
                    [ret appendString:@"&"];
                }
                else{
                    DLogWarn(@"WARNING: unhandled special entity %@", special);
                    [ret appendString:special];
                }
            }
        }
    }
    if (self.length>decRange.location) {
        decRange.length=self.length-decRange.location;
        [ret appendString:[self substringWithRange:decRange]];
    }
    return [ret autorelease];
}

这篇关于无法解析在iphone中获取数据的web服务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆