iOS开发中 xml 数据请求

iOS开发中 xml 数据请求,第1张

NSString *soapStr = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\

<soap:Envelope xmlns:xsi = \"htttp://www.网址.com"\

xmlns:soap = \"http://网址\">\

<soap:header>\

</soap:header>\

<soap:Body>\

// 这中间基本就是要写的参数,在Body 之间就是参数

</soap:Body>\

</soap:Envelope>"] 

NSURL *url=[NSURL URLWithString:@"你自己wsdl文档中对应的endpoint address"]

NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]

// 访问方式[request setHTTPMethod:@"POST"]

// 设置请求头(请求头也可以不设置,前两个设不设置都一样,应该默认的,但是SOAPAction我怎么都设置不对,不设置也可以,干脆不设置了)

// [request addValue:@"text/xmlcharset=utf-8" forHTTPHeaderField:@"Content-Type"]//  [request addValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"]

//    [request addValue:@"nameSpace/methodName" forHTTPHeaderField:@"SOAPAction"]

// body内容 [request setHTTPBody:[soapStr dataUsingEncoding:NSUTF8StringEncoding]]

NSURLSession *session = [NSURLSession sharedSession]

NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSString *result = [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding]

NSLog(@"进入成功回调Session-----结果:%@----请求地址:%@", result, response.URL)

if (error) {

NSLog(@"Session----失败----%@", error.localizedDescription)

}

}]

[task resume]

// 传入一个字典只有唯一(key - value)的数组,

// eg: NSArray *array = @[@{@"addr":@"777"},@{@"999":@"666"},@{@"000":@"111"}]

+ (NSString*)convertDicArrayToXML:(NSArray*)arrayandElement:(NSString*)element {

    if (array.count<=0) {

     return nil

    }

    NSMutableString *mString = [NSMutableString string]

    [mStringappendFormat:@"<%@ xmlns=\"http://tempuri.org/\">",element]

    for (NSDictionary*dic in array) {

        [mStringappendFormat:@"<%@>", dic.allKeys.firstObject]

        [mStringappendFormat:@"%@", dic.allValues.firstObject]

        [mStringappendFormat:@"</%@>\t\t", dic.allKeys.firstObject]

    }

    [mStringappendFormat:@"</%@>", element]

    return mString

}

+ ( void )xmlRequestPOSTWithSoapBody:(NSString*)bodyStringandElement:(NSString*)elementsuccess:( void (^)( id responseObject))successfailure:( void (^)(NSError*error))failure {

//    DLog(@"....bodyString = %@", bodyString)

    NSString*soapStr = [NSString stringWithFormat:

                         @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\

                        <soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\

xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\

<soap:Body>%@</soap:Body>\

</soap:Envelope>",bodyString]

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]

    manager.responseSerializer = [AFXMLParserResponseSerializer serializer]

    // 设置请求超时时间

    manager.requestSerializer.timeoutInterval = 15

    // 返回NSData

    manager.responseSerializer = [AFHTTPResponseSerializer serializer]

    // 设置请求头,也可以不设置

    [manager.requestSerializer setValue:@"text/xmlcharset=utf-8" forHTTPHeaderField:@"Content-Type"]

    [manager.requestSerializer setValue:[NSString stringWithFormat:@"%zd", soapStr.length] forHTTPHeaderField:@"Content-Length"]

    [manager.requestSerializer setValue:[NSString stringWithFormat:@"http://tempuri.org/%@",element] forHTTPHeaderField:@"SOAPAction"]

    // 设置HTTPBody

    [manager.requestSerializersetQueryStringSerializationWithBlock:^NSString*(NSURLRequest*request,NSDictionary*parameters,NSError* __autoreleasing *error) {

        return soapStr

    }]

    [managerPOST:webService_Urlparameters:soapStrprogress:^(NSProgress* _Nonnull uploadProgress) {

    }success:^(NSURLSessionDataTask* _Nonnull task, id   _Nullable responseObject) {

        //DLog(@"responseObject = %@", responseObject)

        // 把返回的二进制数据转为字符串

        NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]

       // DLog(@"result = %@", result)

        // 利用正则表达式取出之间的字符串

        NSString*resultString = [NSStringstringWithFormat:@"(?<=%@Result\\>).*(?=</%@Result)",element,element]//@"(?<=return\\>).*(?=</return)"

        NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:resultString  options:NSRegularExpressionCaseInsensitive error: nil ]

        NSDictionary *dict = [NSDictionary dictionary]     for (NSTextCheckingResult*checkingResult in [regularmatchesInString:resultoptions:0range:NSMakeRange(0, result.length)]) {

            // 得到字典

            dict = [NSJSONSerialization JSONObjectWithData:[[result substringWithRange:checkingResult.range] dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error: nil ]

        }

        if (success) {

            success(dict)

        }

       // DLog(@"dic = %@", dict)

    }failure:^(NSURLSessionDataTask* _Nullable task,NSError* _Nonnull error) {

        DLog(@"error = %@", error)

        if (failure) {

            failure(error)

        }

    }]

}

调用一下:

+ ( void )mallListWithType:(NSString * _Nullable )type

                 success:( void (^ _Nullable )( id _Nullable responseObject))success

                 failure:( void (^ _Nullable )(NSString* _Nullable strError))failure {

    NSString *element = @"ZHWS_GetActivityMallAdList"

    NSArray*bodyArray =@[

        @{@"Type":type}

    ]

    NSString*bodyString = [ self convertDicArrayToXML:bodyArrayandElement:element]

    [ self xmlRequestPOSTWithSoapBody:bodyStringandElement:elementsuccess:^( id responseObject) {

        DLog(@"... 活动相关、商场广告、广告列表 = %@", responseObject)

        if (responseObject) {

            success(responseObject)

        }

    }failure:^(NSError*error) {

        if (error) {

            //failure(error.mj_JSONString)

        }

    }]

}

近期项目刚好用到这个,之前也没有用过,所以顺手就记录一下。如有错误,看到的小伙伴请指正。

参考链接:https://blog.csdn.net/djh996064549/article/details/79635551

维基上MusicXML的解释是:(英语:Music Extensible Markup Language,音乐扩展标记语言)是一个开放的基于XML的记录西式乐谱的文件格式。该格式是完全自由、开放记录的,并依据W3C社区的许可协议自由使用。

简单的来说,MusicXML其实就是XML,只不过承载的是乐谱信息的XML。在我们需要绘制或者创建六线谱之类的时候,可以通过MusicXML来记录我们需要绘制或者创建的信息。目的是为音乐符号创造一种通用格式。(本文是基于MusicXML 3.0和2.0,所以可能会有一些出入。)因为项目中用到的是吉他谱,就以吉他谱的含义来进行说明和解释。

MusicXML本质也是XML,所以文件上的解析可以按XML的解析来。

XML的解析在iOS里面有两种解析方式,一个SAX解析,一个DOM解析。

SAX解析的特点是逐行进行解析。也就是一边读取一边处理。对于大文件,极大的提高了解析效率。

DOM解析的特点是通过节点解析。需要一次性读取整个XML文件并形成一个节点树,通过遍历树结构可以检索任意XML节点,读取它的属性和值。

比如第三方:GDataXMLNode

在这里我用的SAX解析,具体可以去看下 这里 ,是我之前用来解析MusicXML文档写的。

MusicXML本质上还是XML,所以文件结构是和XML一样的,这个是XML文档所需要的XML声明。声明用的xml版本是1.0和xml传输数据的时候的字符编码。(假如文档里有中文,编码方式不是UTF-8,显示上就会乱码)

这里是说明当前使用的MusicXML版本是什么,标签里面包含的内容就是MusicXML的内容

基本能用到的大多数就是这么多了,更多详细的可以查看MusicXML的 官网文档

绘制的话,看具体的需求了,可以尝试在layer上异步绘制,然后在需要的情况下再渲染到view上。比如用 CAShapeLayer ,轻量,性能又好。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11750155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存