0

Restkit 0.20.1 と RKXMLReaderSerialization 0.20.0 を使用してサーバーから xml 形式のデータをプルする iOS アプリがあります。サーバーがJSONデータを送信した場合、コードはうまく機能しますが、XML形式でデータを取得しようとしているので、行き止まりになりました。まだサーバーからデータを受信して​​いますが、次のエラーが表示されます。

restkit.object_mapping:RKMapperOperation.m:98 Adding mapping error: No mappable values found for any of the attributes or relationship mappings

これは、オブジェクト マッパーがどのデータもコア データ属性に一致するものとして認識しないため、マップするものが何もないことを意味すると想定しています。cocoapods 経由で RKXMLReaderSerialization をインストールし、ドキュメントに従ってクラスを登録しました。しかし、明らかに私は何かが欠けています。誰でも指摘できますか?

ここで、シリアル化クラスを登録します

// Set the default store shared instance
    [RKManagedObjectStore setDefaultStore:managedObjectStore];

    RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://www.myserver.com"]];
    [RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"application/xml"];

マッピングと応答記述子の部分は次のとおりです。

RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Gist" inManagedObjectStore:managedObjectStore];
    [entityMapping addAttributeMappingsFromDictionary:@{
     @"articleId":      @"gistID",
     @"title":          @"title",
     @"hashtags":       @"hashtags",
     @"imageUrl":       @"imageUrl",
     @"summary":        @"summary"}];
    entityMapping.identificationAttributes = @[ @"gistID" ];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping pathPattern:@"/rest/article/getTicker" keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

ログの該当する部分は次のとおりです。

restkit.object_mapping:RKMapperOperation.m:98 Adding mapping error: No mappable values    found for any of the attributes or relationship mappings
restkit.network:RKObjectRequestOperation.m:241 GET 'http://www.myserver.com/rest/article/getTicker?ip=255.255.255.0' (200 OK / 0 objects) [request=0.2420s mapping=0.0151s total=0.2737s]:
    response.headers={
        Connection = "Keep-Alive";
        "Content-Type" = "application/xml";
        Date = "Fri, 31 May 2013 04:30:50 GMT";
        "Keep-Alive" = "timeout=5, max=100";
        "Transfer-Encoding" = Identity;
    }
    response.body=<?xml version="1.0" encoding="UTF-8" standalone="yes"?><tickers><ticker><articleId>7587</articleId><authorId>10</authorId><authorName>AFP  </authorName><city>Kabul</city><copyrightLine>Copyright 2012 AFP</copyrightLine><countryCode>US</countryCode><countryName>AF</countryName><hashTags>#Afghanistan #unrest #art #offbeat </hashTags><imageUrl>http://www.mywebsite.com/services/images/AFP/photo_1369471279196-2-2.jpg</imageUrl><latitude>34.52813</latitude><longitude>69.17233</longitude>

ご覧のとおり、応答本文は、探しているコア データ属性 (articleId、title、ハッシュタグなど) を含む XML として受信されますが、xmlreader を介して本文を実行してはなりません。 iOS と Objective-C は初めてなので、どんな助けも大歓迎です。スニペットは金の重みに値します!
ありがとう

更新... xmlがサーバーから取得される方法は次のとおりです

<?xml version="1.0" encoding="UTF-8"?>
<tickers>
    <ticker>
        <articleId>7587</articleId>
        <authorId>10</authorId>
        <authorName>AFP </authorName>
        <city>Kabul</city>
        <copyrightLine>Copyright 2012 AFP</copyrightLine>
        <countryCode>US</countryCode>
        <countryName>AF</countryName>
        <hashTags>#Afghanistan #unrest #art #offbeat </hashTags>
        <imageUrl>http://www.mywebsite.com/services/images/AFP/photo_1369471279196-2-2.jpg</imageUrl>
        <latitude>34.52813</latitude>
        <longitude>69.17233</longitude>
        <title>Day after Kabul attacks, 10,000 peace balloons</title>
        <totComments>0</totComments>
        <totDislikes>0</totDislikes>
        <totInappropriate>0</totInappropriate>
        <totLikes>0</totLikes>
        <totViews>0</totViews>
    </ticker>

更新 #2.... ここでは、サーバーから XML を受信する場合と JSON を受信する場合の応答のマッピング方法の違いを示します。

シリアル化

tickers =     {
    ticker =         (
                    {
            articleId =                 {
                text = 7587;
            };
            authorId =                 {
                text = 10;
            };
            authorName =                 {
                text = AFP;
            };
            city =                 {
                text = Kabul;
            };
            copyrightLine =                 {
                text = "Copyright 2012 AFP";
            };
           .....Goes on like this for each attribute

サーバーからのJSONダイレクト

    {
    articleId = 7587;
    authorId = 10;
    authorName = "AFP  ";
    city = Kabul;
    copyrightLine = "Copyright 2012 AFP";
    countryCode = US;
    countryName = AF;
    hashTags = "#Afghanistan #unrest #art #offbeat ";
    imageUrl = "http://www.mywebsite.com/services/images/AFP/photo_1369471279196-2-2.jpg";
    latitude = "34.52813";
    longitude = "69.17233";
    title = "Day after Kabul attacks, 10,000 peace balloons";
    totComments = 0;
    totDislikes = 0;
    totInappropriate = 0;
    totLikes = 0;
    totViews = 0;
},

これに対処する方法を知っている人はいますか?

4

1 に答える 1

1

シリーズ化は多分大丈夫だと思います。問題は、マッピングが XML をナビゲートするのに十分な情報を持っていないことだと思います (対応する JSON よりも多くのタグがあると思います)。

XML 内のデータの場所のキーパスを応答記述子に伝えてみてください。

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping pathPattern:@"/rest/article/getTicker" keyPath:@"tickers.ticker" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

更新: マッピングは次のようにする必要がありますか:

[entityMapping addAttributeMappingsFromDictionary:@{
 @"articleId.text":      @"gistID",
 @"title.text":          @"title",
 @"hashtags.text":       @"hashtags",
 @"imageUrl.text":       @"imageUrl",
 @"summary.text":        @"summary"}];
于 2013-05-31T06:24:05.823 に答える