【问题标题】:iPhone XMLRequestiPhone XML 请求
【发布时间】:2010-12-21 18:47:56
【问题描述】:

我有一个向服务器发送 XML 请求的 API:

<?xml version="1.0" encoding="UTF-8"?>
<request type="handle" action="update">
<userdata>
<username>YourUsername</username>
<password>YourPassword</password>
</userdata>
<handledata type="PERSON" id="HandleId">
<name>Mustermann</name>
<firstname>Max</firstname>
<organization>Firma KG</organization>
<street>Musterstrasse 1</street>
<postalcode>11111</postalcode>
<city>Musterstadt</city>
<state>Niedersachsen</state>
<country>DE</country>
<email>email@adresse.de</email>
<phone>+43-111-111111</phone>
<fax>+43-111-111111</fax>
<remarks>remarks</remarks>
</handledata>
</request>

如何在 iPhone 上执行此操作?

【问题讨论】:

    标签: iphone xml nsstring request


    【解决方案1】:

    您可以使用libxml2。我怀疑这是最快的方法。将其框架添加到您的项目中(请参阅this document 的“设置您的项目”部分)。

    在 XML 编写器的标题中,添加以下导入:

    #import <libxml/encoding.h>
    #import <libxml/xmlwriter.h>
    

    在实现中,编写一个方法来生成您的 XML。大概您将通过 NSData* 对象发送请求的字节,因此您可能会编写如下内容:

    - (NSData *) xmlDataFromRequest 
    {
        xmlTextWriterPtr _writer;
        xmlBufferPtr _buf;
        xmlChar *_tmp;
        const char *_UTF8Encoding = "UTF-8";
    
        _buf = xmlBufferCreate();
        _writer = xmlNewTextWriterMemory(_buf, 0);
    
        // <?xml version="1.0" encoding="UTF-8"?>
        xmlTextWriterStartDocument(_writer, "1.0", _UTF8Encoding, NULL);
    
        // <request type="handle" action="update">
        xmlTextWriterStartElement(_writer, BAD_CAST "request");
        xmlTextWriterWriteAttribute(_writer, BAD_CAST "type", BAD_CAST "handle");
        xmlTextWriterWriteAttribute(_writer, BAD_CAST "action", BAD_CAST "update");
        xmlTextWriterEndElement(_writer);
    
        // <userdata>...</userdata>
        xmlTextWriterStartElement(_writer, BAD_CAST "userdata");
        xmlTextWriterStartElement(_writer, BAD_CAST "username");
        _tmp = [self xmlCharPtrForInput:[[NSString stringWithFormat:@"YourUsername"] cStringUsingEncoding:NSUTF8StringEncoding] withEncoding:_UTF8Encoding];
        xmlTextWriterWriteString(_writer, _tmp);
        xmlTextWriterEndElement(_writer); // closing <username>
        xmlFree(_tmp);
        xmlTextWriterStartElement(_writer, BAD_CAST "password");
        _tmp = [self xmlCharPtrForInput:[[NSString stringWithFormat:@"YourPassword"] cStringUsingEncoding:NSUTF8StringEncoding] withEncoding:_UTF8Encoding];
        xmlTextWriterWriteString(_writer, _tmp);
        xmlTextWriterEndElement(_writer); // closing <password>
        xmlFree(_tmp); 
        xmlTextWriterEndElement(_writer); // closing <userdata>
    
        // etc.
    
        xmlTextWriterEndDocument(_writer);
        xmlFreeTextWriter(_writer);
    
        // turn libxml2 buffer into NSData* object
    
        NSData *_xmlData = [NSData dataWithBytes:(_buf->content) length:(_buf->use)];
        xmlBufferFree(_buf);
    
        return _xmlData;
    }
    

    我这里有一个辅助方法,用于将const char * 转换为xmlChar *

    - (xmlChar *) xmlCharPtrForInput:(const char *)_input withEncoding:(const char *)_encoding 
    {
        xmlChar *_output;
        int _ret;
        int _size;
        int _outputSize;
        int _temp;
        xmlCharEncodingHandlerPtr _handler;
    
        if (_input == 0)
            return 0;
    
        _handler = xmlFindCharEncodingHandler(_encoding);
    
        if (!_handler) {
            NSLog(@"convertInput: no encoding handler found for '%s'\n", (_encoding ? _encoding : ""));
            return 0;
        }
    
        _size = (int) strlen(_input) + 1;
        _outputSize = _size * 2 - 1;
        _output = (unsigned char *) xmlMalloc((size_t) _outputSize);
    
        if (_output != 0) {
            _temp = _size - 1;
            _ret = _handler->input(_output, &_outputSize, (const xmlChar *) _input, &_temp);
            if ((_ret < 0) || (_temp - _size + 1)) {
                if (_ret < 0) {
                    NSLog(@"convertInput: conversion wasn't successful.\n");
                } else {
                    NSLog(@"convertInput: conversion wasn't successful. Converted: %i octets.\n", _temp);
                }   
                xmlFree(_output);
                _output = 0;
            } else {
                _output = (unsigned char *) xmlRealloc(_output, _outputSize + 1);
                _output[_outputSize] = 0;  /*null terminating out */
            }
        } else {
            NSLog(@"convertInput: no memory\n");
        }
    
        return _output;
    }
    

    【讨论】:

    • 非常有帮助的回答 Alex。
    【解决方案2】:

    对于这样一个简单的结构,我会使用字符串格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多