2

xmlWriter を使用して XML を作成しています。複数のキーと値のペアを持つ NSDictionary に値がありますが、これらの値の一部は [NSNull null] であり、すべての値を独自の NSString に渡します。

私の XMLWriter メソッドには、これがデータベースへの特定のメソッド呼び出しであるかどうかをチェックする if ステートメントがあります。

各変数を動的にチェックする方法がわかりません.ifステートメントを実行できると思いましたが、変数の1つが等しくない[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に追加して、nullの変数を停止するにはどうすればよいですか? 作成するには、一種の動的 xml ライターだと思います。

4

2 に答える 2

6

通常、同じコードを 2 回以上 (または 1 回以上) 記述する必要がある場合は、メソッドまたは関数の作成を検討する必要があります。したがって、次のようなメソッドを書くことができます。

- (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 に答える