Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析WordPressXMLIOS/Objective-C_Ios_Objective C_Wordpress_Xml Rpc_Gdata - Fatal编程技术网

解析WordPressXMLIOS/Objective-C

解析WordPressXMLIOS/Objective-C,ios,objective-c,wordpress,xml-rpc,gdata,Ios,Objective C,Wordpress,Xml Rpc,Gdata,我正在尝试创建一个iOS应用程序,它(除了其他一些东西)需要加载到Wordpress页面的内容中 当我使用Wordpress的XML-RPC功能中的getPosts功能时,返回了以下内容: <?xml version="1.0" encoding="UTF-8"?> <methodResponse> <params> <param> <value> <array><data>

我正在尝试创建一个iOS应用程序,它(除了其他一些东西)需要加载到Wordpress页面的内容中

当我使用Wordpress的XML-RPC功能中的getPosts功能时,返回了以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
  <params>
    <param>
      <value>
      <array><data>
  <value><struct>
  <member><name>post_id</name><value><string>23</string></value></member>
  <member><name>post_title</name><value><string>&lt;!--:de--&gt;Post1&lt;!--:--&gt;&lt;!--:en--&gt;Post1&lt;!--:--&gt;</string></value></member>
  <member><name>post_date</name><value><dateTime.iso8601>20140211T14:26:39</dateTime.iso8601></value></member>
  <member><name>post_date_gmt</name><value><dateTime.iso8601>20140211T12:26:39</dateTime.iso8601></value></member>
  <member><name>post_modified</name><value><dateTime.iso8601>20140217T22:32:45</dateTime.iso8601></value></member>
  <member><name>post_modified_gmt</name><value><dateTime.iso8601>20140217T20:32:45</dateTime.iso8601></value></member>
  <member><name>post_status</name><value><string>publish</string></value></member>
  <member><name>post_type</name><value><string>post</string></value></member>
  <member><name>post_name</name><value><string>im-notfall</string></value></member>
  <member><name>post_author</name><value><string>1</string></value></member>
  <member><name>post_password</name><value><string></string></value></member>
  <member><name>post_excerpt</name><value><string></string></value></member>
  <member><name>post_content</name><value><string>&lt;!--:de--&gt;&lt;b&gt;Post1&lt;/b&gt;&lt;!--:--&gt;&lt;!--:en--&gt;&lt;b&gt;Post1&lt;/b&gt;&lt;!--:--&gt;</string></value></member>
  <member><name>post_parent</name><value><string>0</string></value></member>
  <member><name>post_mime_type</name><value><string></string></value></member>
  <member><name>link</name><value><string>http://example.com/ExampleProjekt/?p=23</string></value></member>
  <member><name>guid</name><value><string>http://example.com/ExampleProjekt/?p=23</string></value></member>
  <member><name>menu_order</name><value><int>5</int></value></member>
  <member><name>comment_status</name><value><string>closed</string></value></member>
  <member><name>ping_status</name><value><string>open</string></value></member>
  <member><name>sticky</name><value><boolean>0</boolean></value></member>
  <member><name>post_thumbnail</name><value><array><data>
</data></array></value></member>
  <member><name>post_format</name><value><string>standard</string></value></member>
  <member><name>terms</name><value><array><data>
  <value><struct>
  <member><name>term_id</name><value><string>1</string></value></member>
  <member><name>name</name><value><string>Allgemein</string></value></member>
  <member><name>slug</name><value><string>allgemein</string></value></member>
  <member><name>term_group</name><value><string>0</string></value></member>
  <member><name>term_taxonomy_id</name><value><string>1</string></value></member>
  <member><name>taxonomy</name><value><string>category</string></value></member>
  <member><name>description</name><value><string></string></value></member>
  <member><name>parent</name><value><string>0</string></value></member>
  <member><name>count</name><value><int>3</int></value></member>
</struct></value>
</data></array></value></member>
  <member><name>custom_fields</name><value><array><data>
</data></array></value></member>
</struct></value>
  <value><struct>
  <member><name>post_id</name><value><string>9</string></value></member>
  <member><name>post_title</name><value><string>&lt;!--:de--&gt;Post2&lt;!--:--&gt;&lt;!--:en--&gt;Post2&lt;!--:--&gt;</string></value></member>
  <member><name>post_date</name><value><dateTime.iso8601>20140206T13:16:56</dateTime.iso8601></value></member>
  <member><name>post_date_gmt</name><value><dateTime.iso8601>20140206T11:16:56</dateTime.iso8601></value></member>
  <member><name>post_modified</name><value><dateTime.iso8601>20140217T22:33:01</dateTime.iso8601></value></member>
  <member><name>post_modified_gmt</name><value><dateTime.iso8601>20140217T20:33:01</dateTime.iso8601></value></member>
  <member><name>post_status</name><value><string>publish</string></value></member>
  <member><name>post_type</name><value><string>post</string></value></member>
  <member><name>post_name</name><value><string>neuer-erster-beitrag</string></value></member>
  <member><name>post_author</name><value><string>1</string></value></member>
  <member><name>post_password</name><value><string></string></value></member>
  <member><name>post_excerpt</name><value><string></string></value></member>
  <member><name>post_content</name><value><string>&lt;!--:de--&gt;&lt;b&gt;Post2&lt;/b&gt;&lt;!--:--&gt;&lt;!--:en--&gt;&lt;b&gt;Post2&lt;/b&gt;&lt;!--:--&gt;</string></value></member>
  <member><name>post_parent</name><value><string>0</string></value></member>
  <member><name>post_mime_type</name><value><string></string></value></member>
  <member><name>link</name><value><string>http://example.com/ExampleProjekt/?p=9</string></value></member>
  <member><name>guid</name><value><string>http://example.com/ExampleProjekt/?p=9</string></value></member>
  <member><name>menu_order</name><value><int>3</int></value></member>
  <member><name>comment_status</name><value><string>closed</string></value></member>
  <member><name>ping_status</name><value><string>open</string></value></member>
  <member><name>sticky</name><value><boolean>0</boolean></value></member>
  <member><name>post_thumbnail</name><value><array><data>
</data></array></value></member>
  <member><name>post_format</name><value><string>standard</string></value></member>
  <member><name>terms</name><value><array><data>
  <value><struct>
  <member><name>term_id</name><value><string>1</string></value></member>
  <member><name>name</name><value><string>Allgemein</string></value></member>
  <member><name>slug</name><value><string>allgemein</string></value></member>
  <member><name>term_group</name><value><string>0</string></value></member>
  <member><name>term_taxonomy_id</name><value><string>1</string></value></member>
  <member><name>taxonomy</name><value><string>category</string></value></member>
  <member><name>description</name><value><string></string></value></member>
  <member><name>parent</name><value><string>0</string></value></member>
  <member><name>count</name><value><int>3</int></value></member>
</struct></value>
</data></array></value></member>
  <member><name>custom_fields</name><value><array><data>
</data></array></value></member>
</struct></value>
  <value><struct>
  <member><name>post_id</name><value><string>5</string></value></member>
  <member><name>post_title</name><value><string>&lt;!--:de--&gt;Post3&lt;!--:--&gt;&lt;!--:en--&gt;Post3&lt;!--:--&gt;</string></value></member>
  <member><name>post_date</name><value><dateTime.iso8601>20131217T17:32:09</dateTime.iso8601></value></member>
  <member><name>post_date_gmt</name><value><dateTime.iso8601>20131217T15:32:09</dateTime.iso8601></value></member>
  <member><name>post_modified</name><value><dateTime.iso8601>20140217T22:33:18</dateTime.iso8601></value></member>
  <member><name>post_modified_gmt</name><value><dateTime.iso8601>20140217T20:33:18</dateTime.iso8601></value></member>
  <member><name>post_status</name><value><string>publish</string></value></member>
  <member><name>post_type</name><value><string>post</string></value></member>
  <member><name>post_name</name><value><string>test-beitrag-2</string></value></member>
  <member><name>post_author</name><value><string>1</string></value></member>
  <member><name>post_password</name><value><string></string></value></member>
  <member><name>post_excerpt</name><value><string></string></value></member>
  <member><name>post_content</name><value><string>&lt;!--:de--&gt;&lt;b&gt;Post3&lt;/b&gt;&lt;!--:--&gt;&lt;!--:en--&gt;&lt;b&gt;Post3&lt;/b&gt;&lt;!--:--&gt;</string></value></member>
  <member><name>post_parent</name><value><string>0</string></value></member>
  <member><name>post_mime_type</name><value><string></string></value></member>
  <member><name>link</name><value><string>http://example.com/ExampleProjekt/?p=5</string></value></member>
  <member><name>guid</name><value><string>http://example.com/ExampleProjekt/?p=5</string></value></member>
  <member><name>menu_order</name><value><int>4</int></value></member>
  <member><name>comment_status</name><value><string>closed</string></value></member>
  <member><name>ping_status</name><value><string>open</string></value></member>
  <member><name>sticky</name><value><boolean>0</boolean></value></member>
  <member><name>post_thumbnail</name><value><array><data>
</data></array></value></member>
  <member><name>post_format</name><value><string>standard</string></value></member>
  <member><name>terms</name><value><array><data>
  <value><struct>
  <member><name>term_id</name><value><string>1</string></value></member>
  <member><name>name</name><value><string>Allgemein</string></value></member>
  <member><name>slug</name><value><string>allgemein</string></value></member>
  <member><name>term_group</name><value><string>0</string></value></member>
  <member><name>term_taxonomy_id</name><value><string>1</string></value></member>
  <member><name>taxonomy</name><value><string>category</string></value></member>
  <member><name>description</name><value><string></string></value></member>
  <member><name>parent</name><value><string>0</string></value></member>
  <member><name>count</name><value><int>3</int></value></member>
</struct></value>
</data></array></value></member>
  <member><name>custom_fields</name><value><array><data>
</data></array></value></member>
</struct></value>
</data></array>
      </value>
    </param>
  </params>
</methodResponse>
我还尝试使用WPXMLRPC框架->

使用此代码:

WPXMLRPCDecoder *decodedWPXML = [[WPXMLRPCDecoder alloc] initWithData:XMLcontent];
if ([decodedWPXML isFault]) {
    NSLog(@"XML-RPC error %ld: %@", (long)[decodedWPXML faultCode], [decodedWPXML faultString]);
} else {
    NSLog(@"XML-RPC response: %@", [decodedWPXML object]);
}
我设法接收一个对象,我可以通过NSLog(@“%@”,object)输出该对象; 但我无法进一步处理通过这种方式收到的任何数据。 我对objective-c很陌生(可能对某些人来说很明显)。 我也看过官方的wordpress for iOS应用程序,但我无法使用任何代码

任何帮助都将不胜感激,我不介意使用任何不同的框架/技术等。如果它们有助于获得我的解决方案。

我很高兴,它是免费的。您可以轻松地将请求微调到特定的页面和帖子类型,这是有据可查的。您从站点得到的总是JSON(优于XML;)中的字典和数组结构。检查JSON结构的好方法是

一些开始使用的示例代码

- (void)loadNewsForPage:(NSUInteger)page
{

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.mywordpresssite.com/api/get_posts/?page=%lu", (unsigned long)page]]
            completionHandler:^(NSData *data,
                                NSURLResponse *response,
                                NSError *error) {

                // handle response
                NSError *jsonError = nil;
                id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];

                if (!jsonError) {
                    if ([jsonObject isKindOfClass:[NSDictionary class]]) {

                        // fill datastore
                        [self newsIntoDataStore:(NSDictionary *)jsonObject forPage:page];
                    }
                    else {
                        NSLog(@"returned jsonObject is not a dictionary!");
                    }
                } else {
                    NSLog(@"jsonError, news: %@", jsonError);
                }

            }] resume];
}

- (void)newsIntoDataStore:(NSDictionary *)news forPage:(NSUInteger)page
{
    if ([[news objectForKey:@"status"] isEqualToString:@"ok"]) {

        self.newsPages = [[news objectForKey:@"pages"] integerValue];
        NSArray *posts = [news objectForKey:@"posts"];

        if (posts.count > 0) {
            // store individual posts

            for (NSDictionary *post in posts) {

                // determine post slug
                NSArray *categoriesArray = [post objectForKey:@"categories"];
                NSString *postSlug = nil;
                NSString *desiredSlug = @"news";

                if (categoriesArray.count > 0) {
                    for (NSDictionary *category in categoriesArray) {
                        if ([[category objectForKey:@"slug"] isEqualToString:desiredSlug]) {
                            postSlug = desiredSlug;
                        }
                    }
                }

                    NSString *title = [post objectForKey:@"title"];

                    NSDate *dateFromAPI = [self.dateFormatterFromAPI dateFromString:[post objectForKey:@"date"]];
                    NSString *date = [self.dateFormatterForCell stringFromDate:dateFromAPI];

                    NSString *imageURLStringOrg = [[[post objectForKey:@"thumbnail_images"] objectForKey:@"full"] objectForKey:@"url"];
                    NSString *imageURLStringConverted = [imageURLStringOrg stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

                    NSAttributedString *attributedContentString = [[NSAttributedString alloc] initWithData:[[post objectForKey:@"excerpt"] dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
                    NSString *content = [attributedContentString string];

                    NSString *url = [post objectForKey:@"url"];

                    if (title && date && imageURLStringConverted && content && url) {

                        NSDictionary *postDictionary = @{@"title" : title, @"date" : date, @"imageURL" : imageURLStringConverted, @"content" : content, @"url" : url};

                        [self.newsArray addObject:postDictionary];

                    } else {
                        NSLog(@"some post item empty, skipping this post: %lu", (unsigned long)[posts indexOfObject:post]);
                    }
                }

            }

            dispatch_async(dispatch_get_main_queue(), ^{

                if (self.pageLoaded < self.newsPages) {
                    [self loadNewsForPage:self.pageLoaded + 1];
                } else {

                    [self.delegate newsFetchingCompleted];
                }
            });

        } else {
            NSLog(@"no objects in the array");
        }
    } else {
        NSLog(@"returned status NOT OK");
    }
}
-(void)loadNewsForPage:(nsInteger)页面
{
NSURLSession*会话=[NSURLSession sharedSession];
[[session dataTaskWithURL:[NSURL URLWithString:[NSString stringWithFormat:@]http://www.mywordpresssite.com/api/get_posts/?page=%lu“,(未签名长)页]]
completionHandler:^(NSData*数据,
NSURLResponse*响应,
N错误*错误){
//处理响应
n错误*jsonError=nil;
id jsonObject=[NSJSONSerialization jsonObject WithData:数据选项:针织错误:&jsonError];
如果(!jsonError){
if([jsonObject IsKindof类:[NSDictionary类]]){
//填充数据存储
[self-newsIntoDataStore:(NSDictionary*)jsonObject for page:page];
}
否则{
NSLog(@“返回的jsonObject不是字典!”);
}
}否则{
NSLog(@“jsonError,新闻:%@”,jsonError);
}
}]恢复];
}
-(void)newsIntoDataStore:(NSDictionary*)新闻页面:(NSInteger)页面
{
if([[news objectForKey:@“status”]IsequalString:@“ok”]){
self.newsPages=[[news objectForKey:@“pages”]integerValue];
NSArray*posts=[news objectForKey:@“posts”];
如果(posts.count>0){
//存储单个帖子
用于(NSDictionary*投递投递){
//确定后段塞
NSArray*categoriesArray=[post-objectForKey:@“categories”];
NSString*POSTSLAUG=nil;
NSString*desiredSlug=@“新闻”;
如果(categoriesArray.count>0){
for(NSDictionary*类别数组中的类别){
if([[category objectForKey:@“slug”]IsequalString:desiredSlug]){
后段塞=所需段塞;
}
}
}
NSString*title=[PostObjectForkey:@“title]”;
NSDate*dateFromAPI=[self.dateFormatterFromAPI dateFromString:[post objectForKey:@“date”];
NSString*date=[self.DateFormatter Forcell stringFromDate:dateFromAPI];
NSString*imageURLStringOrg=[[post objectForKey:@“缩略图”]objectForKey:@“完整”]objectForKey:@“url”];
NSString*imageURLStringConverted=[imageURLStringOrg stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSAttributedString*attributedContentString=[[NSAttributedString alloc]initWithData:[[post objectForKey:@“摘录”]dataUsingEncoding:NSUTF8StringEncoding]选项:@{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:[NSNumber numberWithInt:NSUTF8StringEncoding]}文档属性:无错误:无];
NSString*content=[attributedContentString];
NSString*url=[PostObjectForkey:@“url”];
如果(标题、日期和图像url、内容和url){
NSDictionary*postDictionary=@{@“title”:title,@“date”:date,@“imageURL”:imageURLStringConverted,@“content”:content,@“url”:url};
[self.newsArray addObject:postDictionary];
}否则{
NSLog(@“某些帖子项为空,跳过此帖子:%lu”,(未签名长)[posts indexOfObject:post]);
}
}
}
dispatch\u async(dispatch\u get\u main\u queue()^{
if(self.pageload
为我提供一个包含所有post成员的数组,我可以通过该数组进行迭代
for(XMLofPosts中的gdataxmlement*postMember){…}

谢谢你的帮助。 我打开了一篇关于这个主题的新帖子,提出了一个更详细的问题,因为我发现这是一个完全不同的问题,因为它在GDATEXML上比在WordPressXML上更重要

on幸运的是,通过这种方式我无法获得菜单顺序,菜单顺序取消了在wordpress后端对帖子进行手动排序的功能。WPXMLRPCDecoder似乎也返回json代码,但它只是保存为一个对象(实际上是一个NSobject),是否有办法将其转换为NSDictionary?NSobject只是NSDictionary的超类。返回对象的处理是示例代码的一部分,请参见//handle response下的。有一种检查retu的方法
- (void)loadNewsForPage:(NSUInteger)page
{

    NSURLSession *session = [NSURLSession sharedSession];
    [[session dataTaskWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.mywordpresssite.com/api/get_posts/?page=%lu", (unsigned long)page]]
            completionHandler:^(NSData *data,
                                NSURLResponse *response,
                                NSError *error) {

                // handle response
                NSError *jsonError = nil;
                id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&jsonError];

                if (!jsonError) {
                    if ([jsonObject isKindOfClass:[NSDictionary class]]) {

                        // fill datastore
                        [self newsIntoDataStore:(NSDictionary *)jsonObject forPage:page];
                    }
                    else {
                        NSLog(@"returned jsonObject is not a dictionary!");
                    }
                } else {
                    NSLog(@"jsonError, news: %@", jsonError);
                }

            }] resume];
}

- (void)newsIntoDataStore:(NSDictionary *)news forPage:(NSUInteger)page
{
    if ([[news objectForKey:@"status"] isEqualToString:@"ok"]) {

        self.newsPages = [[news objectForKey:@"pages"] integerValue];
        NSArray *posts = [news objectForKey:@"posts"];

        if (posts.count > 0) {
            // store individual posts

            for (NSDictionary *post in posts) {

                // determine post slug
                NSArray *categoriesArray = [post objectForKey:@"categories"];
                NSString *postSlug = nil;
                NSString *desiredSlug = @"news";

                if (categoriesArray.count > 0) {
                    for (NSDictionary *category in categoriesArray) {
                        if ([[category objectForKey:@"slug"] isEqualToString:desiredSlug]) {
                            postSlug = desiredSlug;
                        }
                    }
                }

                    NSString *title = [post objectForKey:@"title"];

                    NSDate *dateFromAPI = [self.dateFormatterFromAPI dateFromString:[post objectForKey:@"date"]];
                    NSString *date = [self.dateFormatterForCell stringFromDate:dateFromAPI];

                    NSString *imageURLStringOrg = [[[post objectForKey:@"thumbnail_images"] objectForKey:@"full"] objectForKey:@"url"];
                    NSString *imageURLStringConverted = [imageURLStringOrg stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

                    NSAttributedString *attributedContentString = [[NSAttributedString alloc] initWithData:[[post objectForKey:@"excerpt"] dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil];
                    NSString *content = [attributedContentString string];

                    NSString *url = [post objectForKey:@"url"];

                    if (title && date && imageURLStringConverted && content && url) {

                        NSDictionary *postDictionary = @{@"title" : title, @"date" : date, @"imageURL" : imageURLStringConverted, @"content" : content, @"url" : url};

                        [self.newsArray addObject:postDictionary];

                    } else {
                        NSLog(@"some post item empty, skipping this post: %lu", (unsigned long)[posts indexOfObject:post]);
                    }
                }

            }

            dispatch_async(dispatch_get_main_queue(), ^{

                if (self.pageLoaded < self.newsPages) {
                    [self loadNewsForPage:self.pageLoaded + 1];
                } else {

                    [self.delegate newsFetchingCompleted];
                }
            });

        } else {
            NSLog(@"no objects in the array");
        }
    } else {
        NSLog(@"returned status NOT OK");
    }
}
GDataXMLDocument *XMLdoc = [[GDataXMLDocument alloc] initWithData:XMLcontent options:0 error:nil];
NSArray *XMLofPosts = [XMLdoc  nodesForXPath:@"//methodResponse/params/param/value/array/data/value/struct/member" error:nil];