升级到iOS 8.3以后使用LibXML解析文件总是失败

iOS 码拜 9年前 (2015-04-30) 1081次浏览 0个评论

我的应用使用LibXML进行XML文件解析,在iOS 8.2运行正常。

最近升级Xcode 到6.3以及iPad Air 到iOS 8.3以后,运行程序总是解析XML失败。

NSString *myXMLPath=@”/User/Long/Documents/testdata/library.xml”;
xmlDocPtr myDoc = xmlParseFile([myXMLPath cStringUsingEncoding:NSUTF8StringEncoding]);

其中xmlParseFile函数返回的总是Null.

有遇到相同问题的朋友没有?

升级到iOS 8.3以后使用LibXML解析文件总是失败
方便的话,能不能把你 xml 的内容发上来?我试试
升级到iOS 8.3以后使用LibXML解析文件总是失败
是一个很简单的XML文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<library-configuration>
</library-configuration>
升级到iOS 8.3以后使用LibXML解析文件总是失败
如果是将内容先装到内存中,再解析就可以,但是直接传文件进去不行。

以下代码可以运行:

    NSString *xmlPathExt = [NSString stringWithFormat:@"%@%@", @"file://", xmlPath];
    NSError *error;
    NSURL *url = [NSURL URLWithString:xmlPathExt];
    
    NSString *xmlContent = [[NSString alloc]
                            initWithContentsOfURL:url
                            encoding:NSUTF8StringEncoding
                            error:&error];
    xmlDocPtr xmlDoc = xmlParseDoc([xmlContent cStringUsingEncoding:NSUTF8StringEncoding]);
升级到iOS 8.3以后使用LibXML解析文件总是失败
引用 3 楼 long_jj 的回复:

如果是将内容先装到内存中,再解析就可以,但是直接传文件进去不行。

以下代码可以运行:

    NSString *xmlPathExt = [NSString stringWithFormat:@"%@%@", @"file://", xmlPath];
    NSError *error;
    NSURL *url = [NSURL URLWithString:xmlPathExt];
    
    NSString *xmlContent = [[NSString alloc]
                            initWithContentsOfURL:url
                            encoding:NSUTF8StringEncoding
                            error:&error];
    xmlDocPtr xmlDoc = xmlParseDoc([xmlContent cStringUsingEncoding:NSUTF8StringEncoding]);

我觉得是这个 xmlPath 不对,你到对应的 path 下找找,看能不能找到 xml 文件。
我用了三种方式来读取本地文件都能读取到:
1. 自己拼接 File 路径的方式,就像你那样:
NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@”test” ofType:@”xml”];
NSString *xmlPathExt = [NSString stringWithFormat:@”%@%@”, @”file://”, xmlPath];
NSURL *url = [NSString stringWithFormat:@”%@%@”, @”file://”, xmlPath];

2. 不用自己拼接,用系统内置的方式:
NSURL *url = [[NSBundle mainBundle] URLForResource:@”test” withExtension:@”xml”];

3. 不用 url,用文件路径:
NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@”test” ofType:@”xml”];
这种方式要用initWithContentsOfFile 代替 initWithContentsOfURL。

综上,我觉得是 xmlPath 的问题,如果你的 xml 文件是在包内,要随app 打包的话,用 [[NSBundle mainBundle] URLForResource:@”test” withExtension:@”xml”]取本地文件的路径;如果 xml 文件是从网络下载到本地的,比如是下载到 Document 目录下的,用这种方式获取 Document 目录:
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
然后再拼接 xml 文件的路径。

升级到iOS 8.3以后使用LibXML解析文件总是失败
按照你说的方法我试了一下:
1. 我把XML文件放在模拟器的Documents目录下
2. 使用以下代码得到Documents的路径:
 NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

3. 然后拼接上我的XML文件名,试图读取。出来的结果还是nil. 

休息了,明天再看看。

谢谢了! 

升级到iOS 8.3以后使用LibXML解析文件总是失败
40分
引用 5 楼 long_jj 的回复:

按照你说的方法我试了一下:
1. 我把XML文件放在模拟器的Documents目录下
2. 使用以下代码得到Documents的路径:
 NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

3. 然后拼接上我的XML文件名,试图读取。出来的结果还是nil. 

休息了,明天再看看。

谢谢了! 

引用 5 楼 long_jj 的回复:

按照你说的方法我试了一下:
1. 我把XML文件放在模拟器的Documents目录下
2. 使用以下代码得到Documents的路径:
 NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

3. 然后拼接上我的XML文件名,试图读取。出来的结果还是nil. 

休息了,明天再看看。

谢谢了! 

好的,我把我的测试方法也发上来:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSLog(@"%@", documentPath);
    
    NSString *xmlPath = [documentPath stringByAppendingPathComponent:@"test.xml"];
//    NSString *xmlPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];
//    NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"xml"];
//    NSString *xmlPathExt = [NSString stringWithFormat:@"%@%@", @"file://", xmlPath];
    NSError *error;
//    NSURL *errorUrl = [NSURL URLWithString:xmlPathExt];
    
    NSString *xmlContent = [[NSString alloc]
                            initWithContentsOfFile:xmlPath
                            encoding:NSUTF8StringEncoding
                            error:&error];
    xmlDocPtr xmlDoc = xmlParseDoc([xmlContent cStringUsingEncoding:NSUTF8StringEncoding]);
}

升级到iOS 8.3以后使用LibXML解析文件总是失败
升级到iOS 8.3以后使用LibXML解析文件总是失败

升级到iOS 8.3以后使用LibXML解析文件总是失败
补充一下,是8.3:
升级到iOS 8.3以后使用LibXML解析文件总是失败
升级到iOS 8.3以后使用LibXML解析文件总是失败
找到原因了。

在我的程序中,首先使用SAX解析/处理一个XML文件,在parserDidEndDocument函数中,我调用了xmlParseFile。在iOS8.2和之前的版本,这样没有问题。但在iOS 8.3里就不行了。

我将我的代码从parseDidEndDocument函数中挪到外边,等到SAX处理完毕以后再调用这些逻辑。xmlParseFile就可以工作了。

但暂时还不知道Apple 在iOS 8.3里边做了什么改动导致这个变化。

感谢zhangao0086的关注。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明升级到iOS 8.3以后使用LibXML解析文件总是失败
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!