The Sudzc generated code is over writing a dictionary for deserialized nodes. If I use the NSLog(@"The Child Node: %@", [[[element children] objectAtIndex:0] stringValue]); it will write the correct items out each time it passed through. When I try to retrieve the results in code only the last one is available (Jackson 3). What am I doing wrong?
// 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;
}
NSLog:
2012-04-19 14:13:07.802 Management[3043:10703] Hopefully Child: Allen
2012-04-19 14:13:07.803 Management[3043:10703] Hopefully Child: 1
2012-04-19 14:13:07.804 Management[3043:10703] Hopefully Child: John
2012-04-19 14:13:07.804 Management[3043:10703] Hopefully Child: 2
2012-04-19 14:13:07.805 Management[3043:10703] Hopefully Child: Jackson
2012-04-19 14:13:07.805 Management[3043:10703] Hopefully Child: 3
XML:
<TC diffgr:id="TC1" msdata:rowOrder="0">
<CSHR_POS_NAME>Allen</CSHR_POS_NAME>
<CSHR_NUM>66</CSHR_NUM>
</TC>
<TC diffgr:id="TC2" msdata:rowOrder="1">
<CSHR_POS_NAME>John</CSHR_POS_NAME>
<CSHR_NUM>2</CSHR_NUM>
</TC>
<TC diffgr:id="TC3" msdata:rowOrder="2">
<CSHR_POS_NAME>Jackson</CSHR_POS_NAME>
<CSHR_NUM>3</CSHR_NUM>
</TC>
Solved (changed the soap.m):
as soon as I get enough rep points I will, but I did notice that the code begins and ends with
and for me I had to remove the initial line, and that fixed it for me, so the code looks like this:
}
I'm uncertain on how you applied your fix, are you replacing the entire code in deserializeAsDictionary or are you appending to the end of the code?
see there's a for loop where the code line
is found, so I'm guessing you simply extended that so that instead of closing the for loop you simply extend it here, is this right?
I was having issues with the above code - it was overwriting the first entry each time - ie I would get a list of 4 items and the first and fourth would be duplicated.
After a lot of exhausting stepping thru code (love recursive code NOT), I found what I believe was the issue;
My code is as follows:
I found that you have to put an else block in as well:
Otherwise elements in 'd' will be overwritten because setObject is called twice.