无法解析在 iPhone 中获取数据的 Web 服务

2024-03-27

我是电话编程新手。使用下面的代码我得到网络服务的响应

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;[email protected] /cdn-cgi/l/email-protection&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 中也是如此

使用下面的代码我正在尝试解析数据,但这里它没有加载数据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就像下面的空的一样。我想使用开始和结束元素来解析数据。

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

NSXMLParser不会将数据解析为NSDictionary对于您来说,它将循环遍历所有元素,并且您需要使用其委托来获取所需的值(NSXMLParserDelegate).

有一些框架,例如XML阅读器 https://github.com/amarcadet/XMLReader(实际上使用NSXMLParser),它将所有元素解析为NSDictionary or NSArray(取决于 xml 的格式)。

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

关于&字符,那些被编码的html字符 https://stackoverflow.com/questions/1105169/html-character-decoding-in-objective-c-cocoa-touch。服务器上可能存在问题,因为它返回部分已编码的 xml,部分已解码。

EDIT:

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

-(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];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法解析在 iPhone 中获取数据的 Web 服务 的相关文章

随机推荐