I'am able to display the data in nsdictionary using this code
NSString *testXMLString = #"<items><item id=\"0001\" type=\"donut\"><name>Cake</name><ppu>0.55</ppu><batters><batter id=\"1001\">Regular</batter><batter id=\"1002\">Chocolate</batter><batter id=\"1003\">Blueberry</batter></batters><topping id=\"5001\">None</topping><topping id=\"5002\">Glazed</topping><topping id=\"5005\">Sugar</topping></item></items>";
NSError *parseError = nil;
NSDictionary *xmlDictionary = [XMLReader dictionaryForXMLString:testXMLString error:&parseError];
NSLog(#"%#", xmlDictionary);
and the output is
items = {
item = {
batters = {
batter = (
{
id = 1001;
text = Regular;
},
{
id = 1002;
text = Chocolate;
},
{
id = 1003;
text = Blueberry;
}
);
};
id = 0001;
name = {
text = Cake;
};
ppu = {
text = "0.55";
};
topping = (
{
id = 5001;
text = None;
},
{
id = 5002;
text = Glazed;
},
{
id = 5005;
text = Sugar;
}
);
type = donut;
};
}; }
Can anyone please help me how to convert this dictionary into a xml file?
The NSPropertyListSerialization class should be able to do this for you.
Related
This question is unlikely to help any future visitors; it is only relevant to a small geographic area, a specific moment in time, or an extraordinarily narrow situation that is not generally applicable to the worldwide audience of the internet. For help making this question more broadly applicable, visit the help center.
Closed 10 years ago.
I have a dictionary like :
{
levels = {
exchange = {
text = ALL;
};
product = {
text = ALL;
};
segment = {
text = ALL;
};
symbol = {
text = ALL;
};
};
marginavailable = {
adhocmargin = {
text = "0.00";
};
branchadhoc = {
text = "0.00";
};
cashmarginavailable = {
text = "0.00";
};
collateralvalue = {
text = "0.00";
};
credits = {
text = "0.00";
};
directcollateralvalue = {
text = "0.00";
};
notionalcash = {
text = 0;
};
payinamount = {
text = "0.00";
};
};
marginutilised = {
adhocscripmargin = {
text = "0.00";
};
category = {
text = 0;
};
cncmarginused = {
text = 0;
};
cncsellcreditpresent = {
text = 0;
};
debits = {
text = "0.00";
};
elm = {
text = "0.00";
};
exposuremargin = {
text = "0.00";
};
grossexposurevalue = {
text = "0.00";
};
ipoamount = {
text = "0.00";
};
mfamount = {
text = "0.00";
};
multiplier = {
text = "0.00";
};
payoutamount = {
text = "0.00";
};
premiumpresent = {
text = "0.00";
};
realisedmtom = {
text = "-0.00";
};
scripbasketmargin = {
text = "0.00";
};
spanmargin = {
text = "0.00";
};
subtotal = {
text = "0.00";
};
turnover = {
text = "0.00";
};
unrealisedmtom = {
text = "-0.00";
};
valueindelivery = {
text = "0.0";
};
varmargin = {
text = "0.00";
};
};
net = {
text = "0.00";
};
}
Above dictionary contains four keys that is levels,marginavailable,marginutilised and net etc
I want objects from first three keys and last object in to an array.I have tried a lot but not finding out any logic to parse it.
I want array of dictionary like this
exchange = {
text = ALL;
};
product = {
text = ALL;
};
segment = {
text = ALL;
};
symbol = {
text = ALL;
};
adhocmargin = {
text = "0.00";
};
branchadhoc = {
text = "0.00";
};
cashmarginavailable = {
text = "0.00";
};
collateralvalue = {
text = "0.00";
};
credits = {
text = "0.00";
};
directcollateralvalue = {
text = "0.00";
};
notionalcash = {
text = 0;
};
payinamount = {
text = "0.00";
};
adhocscripmargin = {
text = "0.00";
};
category = {
text = 0;
};
cncmarginused = {
text = 0;
};
cncsellcreditpresent = {
text = 0;
};
debits = {
text = "0.00";
};
elm = {
text = "0.00";
};
exposuremargin = {
text = "0.00";
};
grossexposurevalue = {
text = "0.00";
};
ipoamount = {
text = "0.00";
};
mfamount = {
text = "0.00";
};
multiplier = {
text = "0.00";
};
payoutamount = {
text = "0.00";
};
premiumpresent = {
text = "0.00";
};
realisedmtom = {
text = "-0.00";
};
scripbasketmargin = {
text = "0.00";
};
spanmargin = {
text = "0.00";
};
subtotal = {
text = "0.00";
};
turnover = {
text = "0.00";
};
unrealisedmtom = {
text = "-0.00";
};
valueindelivery = {
text = "0.0";
};
varmargin = {
text = "0.00";
};
net = {
text = "0.00";
};
thanks in advance.
You can use addEntriesFromDictionary: of NSMutableDictionary to build a new dictionary that merges each of the second-level dictionaries of your original data.
Something like this:
// Original data presumed held in origData
NSMutableDictionary *newDict = [NSMutableDictionary dictionary];
[newDict addEntriesFromDictionary: [origData objectForKey: #"levels"]];
// etc. for the other keys
You just try following logic it may help you.
resultAry = [[NSMutableArray alloc]init];
[resultAry addObject:[[parentDictionary objectForKey:#"levels"]objectForKey:#"exchange"]];
Like that you add all object from levels key then follow the same way for marginavailable and marginutilised
Then finally add net
[resultAry addObject:[parentDictionary objectForKey:#"net"]];
This code should hold good if the maindictionary contains dictionaries
NSMutableArray *dictionaryArray = [[NSMutableArray alloc]init];
for (NSDictionary *childDictionaries in rootDict) { // rootDict is the original dictionary whic has all the four keys levels,marginAvailable,marginutilized and net
for (NSDictionary *dict in childDictionaries) {
[dictionaryArray addObject:dict];
}
}
NSMutableArray *newArray = [[NSMutableArray alloc]init];
[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop)
{
if ([(NSString *)key isEqualToString:#"marginutilised"])
*stop = YES;
[newArray addObjectsFromArray:(NSArray *)obj];
}];
Now you can got the result in newArray :)
To get all objects in a array, you can also use enumerateKeysAndObjectsUsingBlock: like so
NSMutableArray *yourArray = [NSMutableArray arrayWithCapacity:0];
[yourDict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if([(NSString*)key isEqualToString:#"net"]){
[yourArray addObject:[(NSDictionary*)obj objectForKey:#"net"]];
*stop = YES;
}
[yourArray addObject:obj];
}];
Sorry for the long question but that best summarizes what I am trying to do:
My JSON Looks like:
{
4e8cf1d6c7e24c063e000000 = {
"_id" = {
"$id" = 4e8cf1d6c7e24c063e000000;
};
author = faisal;
comments = (
{
author = adias;
comment = amazing;
},
{
author = nike;
comment = "I concur";
}
);
created = {
sec = 1317772800;
usec = 0;
};
text = "This is a random post";
title = "post # 1";
type = (
punjabi
);
};
4e91fd49c7e24cda74000000 = {
"_id" = {
"$id" = 4e91fd49c7e24cda74000000;
};
author = draper;
comments = (
{
author = adias;
comment = "amazing again";
}
);
created = {
sec = 1318118400;
usec = 0;
};
text = "This is a random post again";
title = "post # 2";
type = (
punjabi
);
};
}
What I would like to do is to ultimately have a UTTableview with each row having a title (text from above JSON):
This is the code I have so far:
NSString *responseString = [request responseString];
NSDictionary *resultsDictionary = [responseString objectFromJSONString];
How do I put everything in an array for the UITableView? Again I am just a little rusty as I can swear I have done that before.
If you don't need the keys then you can convert it to an array by using allValues, e.g.:
NSArray *values = [resultsDictionary allValues];
Does your JSON really parse to an NSDictionary, or is this an NSArray containing NSDictionary instances? If the latter, then isn't it just something like:
NSString *textForCell = [[resultsArray objectAtIndex:row] valueForKey:#"title"];
I am revolving around with a small issue in iPhone while playing around Array and Dictionary. I have and product dictionary with the following data
name = Product;
options = (
{
code = code1;
name = "product AAA";
},
{
code = code1;
name = "product BBB";
},
{
code = "code2";
name = "product BBB";
},
{
code = "code3";
name = "product CCC";
},
{
code = "code3";
name = "product DDD";
},
{
code = code4;
name = "product EEE";
},
{
code = code4;
name = "product FFF";
}
);
Also i have an array of matching products
matchingProducts
{
"product BBB",
"product CCC",
"product DDD"
)
Now, all i want to do is i want to remove from products dictionary comparing to matchingProducts array. how can i do it.
Note: I cannot use key to remove objects as per my business rules. I have issue as i have names are repeated but i have to get the final result dictionary as shown below. Is it possible.
name = Product;
options = (
{
code = code1;
name = "product AAA";
},
{
code = code1;
name = "product BBB";
},
{
code = code4;
name = "product EEE";
},
{
code = code4;
name = "product FFF";
}
);
Please, reply me back if my question is not clear.
I have fixed the similar issue in java using the below code
for (int j = 0; j < matchingProducts.size(); j++) {
String product = ((Product) matchingProducts.elementAt(i)).name;
for (int i = 0; i <Product.size(); i++) {
String productName = ((Product) Product.elementAt(i)).name;
if (product.equals(productName)) {
Product.removeElementAt(i);
break;
}
}
}
NSMutableDictionary *Product = initialize like you did with Products;
NSMutableDictionary *resultant = [NSMutableDictionary alloc]init]; //this will have your result
NSArray *keys = [Product allKeys];
for(int i = 0 ; i < [keys count]; i++)
{
id temp = [Product objectForKey:keys[i]];
bool matchFound = NO;
for (int j = 0; j < [matchingProduct count]; j++)
{
id temptemp = [matchingProduct objectAtIndex:j] //Assuming matchingProduct is an NSArray or NSMutableArray
if(temp == temptemp)
{
matchFound = YES;
}
}
if(!matchFound)
[resultant addObject:temp];
}
// resultant now has what you wanted. Use it.
I have a large NSDictionary that I need to loop through and create separate NSArrays. Here are the contents:
(
{
id = {
text = "";
};
sub = {
text = " , ";
};
text = "";
"thumb_url" = {
text = "";
};
title = {
text = "2010-2011";
};
type = {
text = "title";
};
},
{
id = {
text = "76773";
};
sub = {
text = "December 13, 2010";
};
text = "";
"thumb_url" = {
text = "http://www.puc.edu/__data/assets/image/0004/76774/varieties/thumb.jpg";
};
title = {
text = "College Days - Fall 2010";
};
type = {
text = "gallery";
};
},
{
id = {
text = "";
};
sub = {
text = "";
};
text = "";
"thumb_url" = {
text = "";
};
title = {
text = "2009-2010";
};
type = {
text = "title";
};
},
{
id = {
text = "76302";
};
sub = {
text = "December 3, 2010";
};
text = "";
"thumb_url" = {
text = "http://www.puc.edu/__data/assets/image/0019/76303/varieties/thumb.jpg";
};
title = {
text = "Christmas Colloquy";
};
type = {
text = "gallery";
};
}
)
Each section has a type key, which I need to check. When it finds the title key, I need to add those to an array. Then the next sections that would use the gallery key needs to be in its own array until it finds another title key. Then the gallery keys after that into their own array.
I am using a UITableView section titles and content. So, the NSDictionary above should have one NSArray *titles; array, and two other arrays each containing the galleries that came after the title.
I have tried using a for loop but I just can't seem to get it right. Any ideas would be appreciated.
It's somewhat unclear by your log, but I'm guessing your NSDictionary has values of NSDictionary? If so:
NSMutableArray *titles = [NSMutableArray array];
// etc.
for (id key in sourceDictionary) {
NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
if ([subDictionary objectForKey:#"type"] == #"title")
[titles addObject:[subDictionary objectForKey:#"title"]];
// etc.
}
Your question is a bit unclear... but this is how you would properly loop through an NSDictionary.
EDIT:
NSMutableDictionary *galleries = [NSMutableDictionary dictionary];
NSString *currentTitle;
for (id key in sourceDictionary) {
NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
NSString *type = [subDictionary objectForKey:#"type"];
if (type == #"title") {
currentTitle = [subDictionary objectForKey:#"title"];
if ([galleries objectForKey:currentTitle] == nil)
[galleries setObject:[NSMutableArray array] forKey:currentTitle];
} else if (type == #"gallery" && currentTitle != nil)
[[galleries objectForKey:currentTitle] addObject:subDictionary];
}
After this loop, galleries will contain keys of type NSString (with values of the titles), and corresponding objects of type NSArray (with values of the gallery NSDictionarys). Hopefully this is what you were going for.
NSString *key;
for(key in someDictionary){
NSLog(#"Key: %#, Value %#", key, [someDictionary objectForKey: key]);
}
Modern Objective-C syntax:
NSMutableArray *things = [NSMutableArray array];
NSMutableArray *stuff = [NSMutableArray array];
NSMutableArray *bits = [NSMutableArray array];
[dictionaries enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[things addObject:[obj valueForKeyPath:#"thing"]];
[stuff addObject:[obj valueForKeyPath:#"enclosing_object.stuff"]];
[bits addObject:[obj valueForKeyPath:#"bits"]];
}];
this is the print screen of nsmutablearray.
this 2409,2410,2412 is not fix key. it coming dynamically.
{
2409 = (
{
AltSelectionPrice = "2.00";
},
{
AltSelectionPrice = "3.00";
}
);
2410 = (
{
AltSelectionPrice = "7.00";
},
{
AltSelectionPrice = "0.00";
}
);
2412 = (
{
AltSelectionPrice = "0.00";
},
{
AltSelectionPrice = "9.00";
},
{
AltSelectionPrice = "5.00";
}
);
}
thnx in advance.
I am currently on my work computer which runs Windows so cannot post exact code. But what you need to do is get hold of dictionary in the array. May be like following:
NSDictionary* dict = [myMutableArray objectAtIndex:0];
and then iterate over keys in the dictionary:
for (id key in [dict keyEnumerator]) {
//use the key or get the object of that key using [dict objectForKey:key]
}
Update: I assumed you are getting this array from a JSON parser!