XML для объектов для iPhone с использованием wonderxml - PullRequest
2 голосов
/ 15 марта 2011

Привет всем!Я пытаюсь использовать wonderxml (http://code.google.com/p/wonderxml/) для преобразования моего xml в объекты target-c. Это работает для простого случая, как показано ниже ... XML:

<Defn>
   <name>Test1</name>
   <add>my address</add>
</Defn>

Интерфейс соответствующего класса:

#import <Foundation/Foundation.h>
@interface Defn: NSObject {
    NSString *name;
    NSString *add;
 }
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *add;

@ end

Однако, если у меня есть структура XML, как показано ниже, что мне делать?

   <Defn>
      <contact>
        <name>Test1</name>
        <add>my address</add>
      </contact>
      <contact>
        <name>Test1</name>
        <add>my address</add>
      </contact>
      .
      .
   </Defn>

Каким должен быть интерфейс моего класса?

Ответы [ 4 ]

1 голос
/ 15 марта 2011

В вашем первом примере XML-файл содержит ключ Defn, содержащий строки, и ваш пример ObjC следует этому шаблону с объектом Defn, который содержит 2 строки.

Для второго примера, где выЕсли у вас есть контакт, содержащий строки, а затем несколько контактов в Defn, вы, вероятно, захотите использовать аналогичную схему.За исключением случаев, когда ваш класс Defn будет переименован в контакты, а затем новый класс Defn, содержащий массив объектов контактов.Таким образом, моя реализация будет.

contact.h

#import <Foundation/Foundation.h>
@interface contact: NSObject {
    NSString *name;
    NSString *add;
 }
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *add;
@end

Defn.h

#import <Foundation/Foundation.h>
@interface Defn: NSObject {
    NSMutableArray *contacts;
 }
@property (assign) NSMutableArray * contacts;
@end

Это может быть не лучшим решением, но оно вполне соответствует структуре XMLну и это логичный шаг из вашего исходного примера интерфейса Class.

0 голосов
/ 19 мая 2012

Я сделал обновление класса анализатора XmlParser, чтобы вы могли передавать массив объектов и искомый xml. Сделайте следующие дополнения к указанным файлам, и вы сможете выполнить то, что ищете:

XmlParser.h

-(NSString *)arrayToXml:(NSArray *)objects andTag:(NSString *)tag inNameSpace:(NSString *)nameSpace;

XmlParser.m

- (void)addArray:(NSArray *)objects toParentElement:(GDataXMLElement *)parent
{
    for (id object in objects) {

        const char *objectName = class_getName([object class]);

        NSString *objectNameStr = [[NSString alloc] initWithBytes:objectName length:strlen(objectName) encoding:NSASCIIStringEncoding];

        GDataXMLElement * objectElement = [GDataXMLNode elementWithName:objectNameStr];

        NSMutableDictionary * propertyDic = [XmlParser propertDictionary:object];

        NSString *nodeValue = [NSString stringWithFormat:@"%@",@""];

        for (NSString *key in propertyDic) {

            if ([object valueForKey:key] != nil) {

                if ([[object valueForKey:key] isKindOfClass:[NSSet class]]) {

                    GDataXMLElement * parentElement = [GDataXMLNode elementWithName:key];
                    [self addSet:[object valueForKey:key] toParentElement:parentElement];
                    [objectElement addChild:parentElement];

                } else {

                    if ([[propertyDic objectForKey:key] isEqualToString:@"l"]) {

                        nodeValue = [NSString stringWithFormat:@"%llu",[[object valueForKey:key] unsignedLongLongValue]];

                    } else if ([[propertyDic objectForKey:key] isEqualToString:@"i"]) {

                        nodeValue = [NSString stringWithFormat:@"%d",[object valueForKey:key]];

                    } else {

                        nodeValue = [NSString stringWithFormat:@"%@",[object valueForKey:key]];
                    }

                    GDataXMLElement * childElement = [GDataXMLNode elementWithName:key stringValue:nodeValue];
                    [objectElement addChild:childElement];
                }
            }
        }

        [parent addChild:objectElement];

        [objectNameStr release];
    }
}

//convert object to xml string, you could modify the type maping to fit your requirement, 
//the reperesentation of type could be found in objective-c runtime reference.
-(NSString *)arrayToXml:(NSArray *)objects andTag:(NSString *)tag inNameSpace:(NSString *)nameSpace
{
    GDataXMLElement *parent = [GDataXMLNode elementWithName:tag];
    [parent addNamespace:[GDataXMLNode namespaceWithName:nil stringValue:nameSpace]];

    [self addSet:objects toParentElement:parent];

    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithRootElement:parent];

    NSData *xmlData = document.XMLData;

    NSString *xmlString = [[NSString alloc] initWithData:xmlData encoding:NSUTF8StringEncoding];

    NSString *bodyString = [xmlString substringFromIndex:21];

    NSString *headerString = [XmlHeaderHelper generateXmlHeader:tag and:nameSpace];

    xmlString = [NSString stringWithFormat:@"%@%@", headerString, bodyString];

    [document release];

    return xmlString;
}

Итак, вы сделаете следующий вызов в массиве объектов:

NSArray *contacts = [NSArray arrayFromObjects: contact1, contact2, nil];
[parser arrayToXml:contacts andTag:@"Defn" inNameSpace:@"http://mycontacts.com"]
0 голосов
/ 12 июня 2011

В зависимости от сложности моделей (в вашем случае - слишком простой, возможно, просто используйте GData), ваш пробег для моего решения будет варьироваться.

Но вы можете смешивать WonderXML с его предком GDataXMLDocument. (не проверял код ниже)

// NSMutableArray *contacts = [[NSMutableArray alloc]initWithCapacity:0];

- (void) parseXMLString:(NSString *)xmlString {
    XmlParser *parser = [[[XmlParser alloc] init] autorelease];
    NSData *xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *xmlError;

    GDataXMLDocument *xmlDocument = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&xmlError];
    if (xmlDocument == nil) { 
        NSLog(@" Error parsing the XML Document");
        return; 
    }
    NSArray *contactElements = [[xmlDocument rootElement] elementsForName:@"Defn"];

    for (GDataXMLElement *contactElement in contactElements) {
        NSString  *contactString = [[[[contactElement attributes] objectAtIndex:0] stringValue];
        Contact *contact = [[[Contact alloc] init] autorelease];
        NSMutableArray *contactArray = [parser fromXml:contactString withObject:contact];
        // this should be one object in an array
        [contacts addObject:[contactArray objectAtIndex:0]];
    }
}
0 голосов
/ 15 марта 2011

Количество парсеров xml, я использую xpathquery для iphone, и я обнаружил, что его проще использовать, следуйте этому http://cocoawithlove.com/2008/10/using-libxml2-for-parsing-and-xpath.html надеюсь, это поможет.

...