将NSDictionary转换为XML

我需要以XML格式发布数据。 服务器接受特定的xml格式。 我不想手动编写XML,我想要做的是创build一个NSMutableDictionary填充它,并从NSMutableDictionary转换它的XML。

我使用这个:

 [NSPropertyListSerialization dataWithPropertyList:data format:NSPropertyListXMLFormat_v1_0 options:0 

示例返回是这样的:

 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"> <dict> <key>email</key> <string>me@n.net</string> <key>invoice_date</key> <string>2012-10-11T10:35:09Z</string> <key>invoice_lines</key> <array> <dict> <key>product_id</key> <integer>1021493</integer> <key>quantity</key> <real>1</real> <key>retail_price</key> <real>110</real> </dict> </array> <key>payments</key> <array> <dict> <key>amount</key> <real>288.5</real> </dict> <dict> <key>payment_type_id</key> <integer>1</integer> </dict> </array> 

上述格式不能从服务器读取。

服务器需要像这样的XML提要。

  <invoice> <invoice_date>2012-10-11T10:35:09Z</invoice_date> <email>me@n.net</email> <invoice_lines type="array"> <invoice_line> <product_id>1021505</product_id> <quantity>1</quantity> <retail_price>45</retail_price> </invoice_line> </invoice_lines> <payments type="array"> <payment> <amount>288.5</amount> </payment> </payments> </invoice> 

是否有可能从NSDictionary生成上述的XML?

谢谢!

简短的回答是:不,在Cocoa库中没有内置的能力。

因为你正在写而不是parsing,而且可能处理的是可能标记的有限范围,所以输出XML的代码实际上并不复杂。 它应该只是您Invoice对象中的一个简单方法,如下所示:

 - (NSString*) postStringInXMLFormat { NSMutableString* returnValue = [[NSMutableString alloc] init]; if([self email]) { [returnValue appendString:@"<email>"]; [returnValue appendString:[self email]]; [returnValue appendString:@"</email>"]; } if([self invoice_date]) ... 

等等。 最后归来

 [NSString stringWithString:returnValue] 

有大量的第三方项目试图推广这个过程; 其中几个被列在这个答案:

用于iPhone Apps的Xml序列化库

但是如果你所要做的只是创build一个你的服务器端可以识别的稳定的单一格式,而且你没有可以转换的实体数量,那么推出自己的实体可能就不那么容易了。

这是将字典转换为XMLstring的recursion方法。 它处理字典,数组和string。 字典键是XML标签,字典对象用作树中的值或子项。 在数组的情况下,数组中的每个元素都放置在具有相同标记的同一子级上。

 - (NSString*)ConvertDictionarytoXML:(NSDictionary*)dictionary withStartElement:(NSString*)startElement{ NSMutableString *xml = [[NSMutableString alloc] initWithString:@""]; [xml appendString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"]; [xml appendString:[NSString stringWithFormat:@"<%@>",startElement]]; [self convertNode:dictionary withString:xml andTag:nil]; [xml appendString:[NSString stringWithFormat:@"</%@>",startElement]]; NSString *finalXML=[xml stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"]; NSLog(@"%@",xml); return finalXML; } - (void)convertNode:(id)node withString:(NSMutableString *)xml andTag:(NSString *)tag{ if ([node isKindOfClass:[NSDictionary class]] && !tag) { NSArray *keys = [node allKeys]; for (NSString *key in keys) { [self convertNode:[node objectForKey:key] withString:xml andTag:key]; } }else if ([node isKindOfClass:[NSArray class]]) { for (id value in node) { [self convertNode:value withString:xml andTag:tag]; } }else { [xml appendString:[NSString stringWithFormat:@"<%@>", tag]]; if ([node isKindOfClass:[NSString class]]) { [xml appendString:node]; }else if ([node isKindOfClass:[NSDictionary class]]) { [self convertNode:node withString:xml andTag:nil]; } [xml appendString:[NSString stringWithFormat:@"</%@>", tag]]; } } 

如果你不使用库或需要额外的定制:

 - (NSString*)convertDictionaryToXML:(NSDictionary*)dictionary withStartElement:(NSString*)startElement { return [self convertDictionaryToXML:dictionary withStartElement:startElement isFirstElement:YES]; } - (NSString*)convertDictionaryToXML:(NSDictionary*)dictionary withStartElement:(NSString*)startElement isFirstElement:(BOOL) isFirstElement { NSMutableString *xml = [[NSMutableString alloc] initWithString:@""]; NSArray *arr = [dictionary allKeys]; if (isFirstElement) { [xml appendString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"]; } [xml appendString:[NSString stringWithFormat:@"<%@>\n", startElement]]; for(int i=0; i < [arr count]; i++) { NSString *nodeName = [arr objectAtIndex:i]; id nodeValue = [dictionary objectForKey:nodeName]; if([nodeValue isKindOfClass:[NSArray class]]) { if([nodeValue count]>0) { for(int j=0;j<[nodeValue count];j++) { id value = [nodeValue objectAtIndex:j]; if([value isKindOfClass:[NSDictionary class]]) { [xml appendString:[self convertDictionaryToXML:value withStartElement:nodeName isFirstElement:NO]]; } } } } else if([nodeValue isKindOfClass:[NSDictionary class]]) { [xml appendString:[self convertDictionaryToXML:nodeValue withStartElement:nodeName isFirstElement:NO]]; } else { if([nodeValue length]>0){ [xml appendString:[NSString stringWithFormat:@"<%@>",nodeName]]; [xml appendString:[NSString stringWithFormat:@"%@",[dictionary objectForKey:nodeName]]]; [xml appendString:[NSString stringWithFormat:@"</%@>\n",nodeName]]; } } } [xml appendString:[NSString stringWithFormat:@"</%@>\n",startElement]]; NSString *finalxml=[xml stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"]; return finalxml; } 

并称之为:

 NSString *xmlString = [self convertDictionaryToXML:data withStartElement:startElementName];