2

我正在使用 xmlWriter 创建一个 XML,我在一个具有多个键/值对的 NSDictionary 中有值,但是其中一些值是 [NSNull null],我将每个值都传递到它自己的 NSString 中。

在我的 XMLWriter 方法中,我有一个 if 语句来检查这是否是对 db 的特定方法调用,如果是,那么我想仅为不相等的 NSString 变量创建 writeAttributes [NSNull null]。

我不确定如何动态检查每个变量。我想也许我可以做一个 if 语句,但那是行不通的,因为只要其中一个变量不等于 [NSNull null] 那么它就会跳出这个当 xml 可能需要更多变量时,它是 XMLWritter 的一部分。

这是我失败的想法,所以你明白我想要做什么

// Method Params --->
- (NSMutableData *) addMethodParams
{  
    //allocate serializer (this is using the xmlWriter class)
    id <XMLStreamWriter> xmlWriter = [[XMLWriter alloc] init];
    [xmlWriter writeStartElement:@"Eng"];
        [xmlWriter writeStartElement:@"Parameters"];
            [xmlWriter writeStartElement:@"Vars"];
    if ([methodName isEqualToString:@"SeriesSearch"]) // name of method currently being requested
    {
        if ((NSNull *) Series != [NSNull null]) { // if this is null then its jumped
            [xmlWriter writeAttribute:@"Code" value:Series];
        }
        else if ((NSNull *) IDSeries != [NSNull null]){ //if this is !null then it enters the if statement however it then will jump out and not check over any of the other if statments
            [xmlWriter writeAttribute:@"ManufacturerID" value:IDSeries]; 
        }
        //..


    }
            [xmlWriter writeEndElement];
        [xmlWriter writeEndElement];
    [xmlWriter writeEndElement];

所以问题是如何将具有值的变量添加到我的 xml 中以停止为空的变量?创建我猜是一种动态 xml 编写器。

4

2 回答 2

6

通常,当您必须编写两次以上(甚至多次)相同的代码时,您应该考虑创建一个方法或函数。所以你可以写一个这样的方法:

- (void)writeAttribute:(NSString *)name ifNonNullValue:(id)value toWriter:(id<XMLStreamWriter>)writer {
    if (value != [NSNull null]) {
        [writer writeAttribute:name value:value];
    }
}

并像这样使用它:

[self writeAttribute:@"Code" ifNonNullValue:Series toWriter:xmlWriter];
[self writeAttribute:@"ManufacturerID" ifNonNullValue:IDSeries toWriter:xmlWriter];
...

您还可以考虑将类别添加到XMLWriter. 类别允许您将自己的方法添加到任何类。所以你可以添加一个这样的类别:

// XMLWriter+NonNull.h

#import "XMLWriter.h"

@interface XMLWriter (NonNull)

- (void)writeAttribute:(NSString *)name ifNonNullValue:(id)value;

@end

// XMLWriter+NonNull.m

@implementation XMLWriter (NonNull)

- (void)writeAttribute:(NSString *)name ifNonNullValue:(id)value {
    if (value != [NSNull null]) {
        [self writeAttribute:name value:value];
    }
}

@end

并像这样使用它:

// At top of file
#import "XMLWriter+NonNull.h"

...
    [xmlWriter writeAttribute:@"Code" ifNonNullValue:Series];
    [xmlWriter writeAttribute:@"ManufacturerID" ifNonNullValue:IDSeries];
    ...
于 2012-07-25T03:22:08.070 回答
1

由于值来自字典,您可以设置一个循环来写入所有属性:

NSDictionary *keyToAttr = [NSDictionary dictionaryWithValuesAndKeys:
    @"Code", @"Series", @"ManufacturerID", @"IDSeries", nil];

for (key in keyToAttr) {
    NSString *data = [dataDict objectForKey:key];
    if (data && ((NSNull*)data != [NSNull null])) {
        NSString *attrName = [keyToAttr objectForKey:key];
        [xmlWriter writeAttribute:attrName data]; 
    }
}
于 2012-07-25T03:15:25.907 回答