-1

我正在尝试解析 xml(附加)并从中动态创建一个 ui - 没有成功。有任何想法吗?

XML 看起来像这样:

<root>
 <view id="1" color="0.8 0.7 0.9 1.0" x="0" y="0" width="320" height="480">
  <view id="2" color="0.9 0.1 0.3 1.0" x="20" y="20" width="280" height="200">
     <textfield id="5" x="10" y="90" width="180" height="40" placeholder="enter text" color="1.0 1.0 1.0 1.0" target_id="6"></textfield>
     <button id="4" color="0.2 0.2 0.2 1.0" x="220" y="90" width="40" height="40" title="push"></button>
  </view>
  <view id="3" color="0.1 0.8 0.3 1.0" x="20" y="240" width="280" height="100">
     <label id="6" color="0.5 0.5 0.5 1.0" x="20" y="20" title="some label..." width="200" height="80"></label>
  </view>
</view>
</root>

谢谢!

4

1 回答 1

1

在没有更多信息的情况下,我假设您正在寻找在 Objective-C 中解析 XML 的最佳方法。这个问题的答案是使用NSXMLParser类。

您使用NSXMLParserin 的类必须标记为NSXMLParserDelegate.h 文件,因此您的 .h 文件将如下所示:

#import <UIKit/UIKit.h>

@interface MyParsingController : UIViewController<NSXMLParserDelegate>

@end

现在,假设您已将您在问题中发布的所有 XML 放在NSString被调用的XMLString中,然后您可以将字符串转换为XMLData对象,初始化您的NSXMLParser,并通过调用其parse方法将其设置为:

NSData * XMLData = [XMLString dataUsingEncoding:NSUnicodeStringEncoding];
NSXMLParser * parser = [[NSXMLParser alloc] initWithData:XMLData];
[parser setDelegate:self];
[parser setShouldProcessNamespaces:YES];
[parser parse];

解析器运行后,它将在遍历您的 XML 数据时调用其委托方法,然后您需要解释该数据以构建一个数据模型,然后您可以使用该模型来构建您的 GUI。我不打算为你写那一点,但作为如何解析一些 XML 的示例,这是我最近的一个项目中的代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict{

    if([elementName isEqualToString:@"device"]){
        self.currentDeviceID = [[SRDeviceID alloc]init];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

    if([elementName isEqualToString:@"deviceList"]){
        [self.pairingTableView reloadData];
    }


    if([elementName isEqualToString:@"device"]){
        [self.deviceIDListFromServer addObject:self.currentDeviceID];
    }

    NSString* finalParsedString = [self.currentParseString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];


    if([elementName isEqualToString:@"deviceName"]){
        self.currentDeviceID.deviceName = finalParsedString;
    }

    if([elementName isEqualToString:@"UUID"]){
        self.currentDeviceID.uuid = finalParsedString;
    }

    if([elementName isEqualToString:@"deviceLocation"]){
        self.currentDeviceID.location = finalParsedString;
    }

    if([elementName isEqualToString:@"deviceLastSeenTime"]){
        self.currentDeviceID.lastSeenTime = finalParsedString;
    }

    self.currentParseString = [NSMutableString stringWithString:@""];

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    [self.currentParseString appendString:string];
}

希望有帮助。

于 2013-05-01T14:41:13.673 回答