我需要解析位于我的服务器上的XML文件并返回节点值,而不必将文件下载到设备。现在,该文件正在下载到设备以进行测试。这是我目前的代码:
+ (NSString *)dataFilePath:(BOOL)forSave {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *documentsPath = [documentsDirectory stringByAppendingPathComponent:@"file.xml"];
return documentsPath;
}
+ (NSString *)parse:(NSString *)nodesForPath:(NSString *)elementsForName {
NSString *filePath = [self dataFilePath:FALSE];
NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];
NSError *error;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
if (doc == nil) { return nil; }
ViewController *view = [[[ViewController alloc] init] autorelease];
NSArray *getVersionInfo = [doc nodesForXPath:nodesForPath error:nil];
for (GDataXMLElement *versionInfo in getVersionInfo) {
NSArray *elm1 = [versionInfo elementsForName:elementsForName];
GDataXMLElement *elm2 = (GDataXMLElement *) [elm1 objectAtIndex:0];
return elm2.stringValue;
}
[doc release];
[xmlData release];
}
它工作正常,但它解析文档目录中的文件。如何将其设置为直接从Web服务器解析?感谢
答案 0 :(得分:4)
我能看到这样做的唯一方法是在服务器上运行一个程序来解析文件并将结果返回给手机。
要让手机运行解析文件的代码,它必须读取文件,根据定义,该文件将下载该文件。
答案 1 :(得分:0)
您可以尝试使用XML解析器,只需将从网络接收的数据作为流处理,丢弃不需要的内容。
您从响应中读取了几个字节,解析它们,处理,丢弃,读取更多内容。您可能必须自己实现拉解析器,因为您处理的是不完整的,因此无效的XML,或者查找容忍数据结束的解析器(绝对不是一个有效的解析器)。
如果您正在处理非常庞大的XML文件,那么为解析器创建自己的实现可能是值得的。这样,您只能存储所需的XML片段(您可能需要部分XML“树”或根本不需要,或者您可能需要保留XML中另一个节点引用的其他节点)。
我很抱歉这个通用的答案,但我还没有在iOS上使用过XML解析器,而且我无法在Mac atm附近测试NSXMLParser是否适合你。
修改:相关帖子here。
答案 2 :(得分:-1)
即使您不想将文件保存到硬盘,也必须将该文件的内容加载到RAM中。
将NSData*
转换为NSString
,然后NSString
转换为char*
并将其转发给RapidXML。