0

Sudzc(ARCブランチ)を使用したsoap応答の解析に問題があります。アプリのデータを保存するWCFサービスがあります。応答を正常に取得できるWebサービスに接続できましたが、応答の1つにz:ref属性が含まれているとスタックしました。例なしで説明するのは難しいですよね?;)/ iは重要なデータをたとえば「#someid」に置き換えたので、問題があることを指摘しないでください;)

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
    <ActivityId>#some credentials </ActivityId>
</s:Header>
<s:Body>
    <GetMessagesResponse >
        <GetMessagesResult  xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <AllItemsCount>2</AllItemsCount>
            <Items>
                <Message z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
                    <GlobalId>#msgid</GlobalId>
                    <Content>bbbbbbbb</Content>
                    <CreatedDate>2013-02-14T16:33:07</CreatedDate>
                    <Priority>Normal</Priority>
                    <Receiver z:Id="i2">
                        <GlobalId>#receiverid</GlobalId>
                        <CountryId>37</CountryId>
                        <CreationDate>2013-01-31T16:12:40</CreationDate>
                        <Gender>Male</Gender>
                        <IsDeleted>false</IsDeleted>
                        <Picture i:nil="true" />
                        <UserName>tobiasz</UserName>
                    </Receiver>
                    <Sender z:Id="i3">
                        <GlobalId>#senderid</GlobalId>
                        <CountryId>6</CountryId>
                        <CreationDate>2013-02-04T13:08:40</CreationDate>
                        <Gender>Male</Gender>
                        <IsDeleted>false</IsDeleted>
                        <Picture >
                            #"picture info"
                        </Picture>
                        <UserName>tobiasz2</UserName>
                    </Sender>
                    <Topic>RE: 56765765</Topic>
                </Message>
                <Message z:Id="i4" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
                    <GlobalId>#msgid2</GlobalId>
                    <Content>aaaaaaa</Content>
                    <CreatedDate>2013-02-14T16:31:01</CreatedDate>
                    <Priority>High</Priority>
                    <Receiver z:Ref="i2"/>
                    <Sender z:Ref="i3"/>
                    <Topic>RE: 56765765</Topic>
                </Message>
            </Items>
            <PageIndex>0</PageIndex>
            <RetrievedDateTime>2013-02-15T13:14:57.0813487Z</RetrievedDateTime>
        </GetMessagesResult>
    </GetMessagesResponse>
</s:Body>

ご覧のとおり、受信者ノードをi2として識別する行があり、さらに同じ送信者から同じ受信者への別のメッセージのノードを確認できます。

このxmlの解析に使用されるsudzc生成クラス:

@interface ResultOfGetMessages : SoapObject{
    int _AllItemsCount;
    NSMutableArray* _Items;
    int _PageIndex;
    NSDate* _RetrievedDateTime;
}

@interface Message : WSGlobalObject{
    NSString* _Content;
    NSDate* _CreatedDate;
    NSString* _Priority;
    User* _Receiver;
    User* _Sender;
    NSString* _Topic;
}

@interface User : WSGlobalObject{
    int _CountryId;
    NSDate* _CreationDate;
    NSString* _Gender;
    BOOL _IsDeleted;
    PictureInfo* _Picture;
    NSString* _UserName;
}

Touchxmlを使用するSudzは、それを読み取ることができず(nullの受信者と送信者を取得)、応答は次のように解析されます。

<ResultOfGetMessages>
<AllItemsCount>2</AllItemsCount>
<Items>
    <Message>
        <GlobalId>###</GlobalId>
        <Content>bbbbbbbb</Content>
        <CreatedDate>2013-02-14T16:33:07.000</CreatedDate>
        <Priority>Normal</Priority>
        <Receiver>
            <GlobalId>####</GlobalId>
            <CountryId>37</CountryId>
            <CreationDate>2013-01-31T16:12:40.000</CreationDate>
            <Gender>Male</Gender>
            <IsDeleted>false</IsDeleted>
            <Picture i:nil="true" ></Picture>
            <UserName>tobiasz</UserName>
            <Version>11</Version>
        </Receiver>
        <Sender>
            <GlobalId>e4bda93c-a11c-4ae2-baf1-a15b00e918e7</GlobalId>
            <CountryId>6</CountryId>
            <CreationDate>2013-02-04T13:08:40.000</CreationDate>
            <Gender>Male</Gender>
            <IsDeleted>false</IsDeleted>
            <Picture >
                ####
            </Picture>
            <UserName>tobiasz2</UserName>
            <Version>11</Version>
        </Sender>
        <Topic>RE: 56765765</Topic>
    </Message>
    <Message>
        <GlobalId>###</GlobalId>
        <Content>aaaaaaa</Content>
        <CreatedDate>2013-02-14T16:31:01.000</CreatedDate>
        <Priority>High</Priority>
        <Receiver>
            <CountryId>0</CountryId>
            <IsDeleted>false</IsDeleted>
        </Receiver>
        <Sender>
            <CountryId>0</CountryId>
            <IsDeleted>false</IsDeleted>
        </Sender>
        <Topic>RE: 56765765</Topic>
    </Message>
</Items>
<PageIndex>0</PageIndex>

問題はデシリアライズの深さにあると思います。パーサー(if)は、指定されたIDのレシーバーノードを取得しようとしますが、このIDでマークされたレシーバーノードが他のノード(前のアイテムノード)にあるため失敗します。

助けとあなたの時間を前もって感謝します。

4

1 に答える 1

0

ノードをシリアル化するときに、soap.m で同様の問題が発生しました。このコードが必要でした:

// Deserializes the element in a dictionary.
+(id)deserializeAsDictionary:(CXMLNode*)element {

if([element childCount] == 1) {
CXMLNode* child = [[element children] objectAtIndex:0];
if([child kind] == CXMLTextKind) 
{
     NSLog(@"The Child Node: %@", [[[element children] objectAtIndex:0] stringValue]);
    return [[[element children] objectAtIndex:0] stringValue];

}
}

NSMutableDictionary* d = [NSMutableDictionary dictionary];
for(CXMLNode* child in [element children]) {
id v = [Soap deserialize:child];
if(v == nil) { v = [NSNull null]; }
[d setObject:v forKey:[child name]];
}
return d;
}

に:

// Deserializes the element in a dictionary.
+(id)deserializeAsDictionary:(CXMLNode*)element {

if([element childCount] == 1) {
CXMLNode* child = [[element children] objectAtIndex:0];
if([child kind] == CXMLTextKind) 
{
     NSLog(@"The Child Node: %@", [[[element children] objectAtIndex:0] stringValue]);
    return [[[element children] objectAtIndex:0] stringValue];

}
}

NSMutableDictionary* d = [NSMutableDictionary dictionary];
for(CXMLNode* child in [element children]) {
id v = [Soap deserialize:child];
if(v == nil) { v = [NSNull null]; }
[d setObject:v forKey:[child name]];

if( check != nil ) {             
NSInteger next = 1;             
key = [NSString stringWithFormat:@"%@%04d", [child name], next];
check = [d objectForKey:key]; 
while( check != nil ) {                 
    next++; 
    key = [NSString stringWithFormat:@"%@%04d", [child name], next]; 
    check = [d objectForKey:key]; 
} 
[d setObject:v forKey:key]; 
} else {
[d setObject:v forKey:[child name]];
}
于 2013-10-25T19:47:05.143 に答える