回答
在iPhone OS使用libxslt
其实很简单:
- Download the source-code of libxslt和解压。
- 在您的构建设置中将“libxslt”目录添加到标题搜索路径。另外,在那里添加路径到libxml-headers(通常为
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include/libxml2
)。 - 添加libxml2.2.dylib和libxslt.dylib到链接框架(Xcode的“组&文件”面板:右键点击“框架” - >“添加” - >“现有的框架......” )。
- 创建一个简单的XML文件及其XSL转换。
最后,你可以使用类似于样品上面的代码来获得改造的探讨结果为NSString
(例如,在UIWebView
来显示):
#import <libxml/xmlmemory.h>
#import <libxml/debugXML.h>
#import <libxml/HTMLtree.h>
#import <libxml/xmlIO.h>
#import <libxml/xinclude.h>
#import <libxml/catalog.h>
#import <libxslt/xslt.h>
#import <libxslt/xsltInternals.h>
#import <libxslt/transform.h>
#import <libxslt/xsltutils.h>
...
NSString* filePath = [[NSBundle mainBundle] pathForResource: @"article" ofType: @"xml"];
NSString* styleSheetPath = [[NSBundle mainBundle] pathForResource: @"article_transform" ofType:@"xml"];
xmlDocPtr doc, res;
// tells the libxml2 parser to substitute entities as it parses your file
xmlSubstituteEntitiesDefault(1);
// This tells libxml to load external entity subsets
xmlLoadExtDtdDefaultValue = 1;
sty = xsltParseStylesheetFile((const xmlChar *)[styleSheetPath cStringUsingEncoding: NSUTF8StringEncoding]);
doc = xmlParseFile([filePath cStringUsingEncoding: NSUTF8StringEncoding]);
res = xsltApplyStylesheet(sty, doc, NULL);
char* xmlResultBuffer = nil;
int length = 0;
xsltSaveResultToString(&xmlResultBuffer, &length, res, sty);
NSString* result = [NSString stringWithCString: xmlResultBuffer encoding: NSUTF8StringEncoding];
NSLog(@"Result: %@", result);
free(xmlResultBuffer);
xsltFreeStylesheet(sty);
xmlFreeDoc(res);
xmlFreeDoc(doc);
xsltCleanupGlobals();
xmlCleanupParser();
娄佛朗哥指出,你在iPhone上不允许使用dylibs。
它可以在模拟器和手机的开发过程中正常工作,但只要您将其提交给Apple审批,它就会被拒绝。大概20分钟内我的应用程序就被拒绝了,大概是他们的自动静态分析工具。
取而代之,下载源代码并将其添加到您的项目中,并链接LibXML2.2.dylib(不要问我为什么这个dylib是允许的,但XSLT不是!)并构建项目。这几乎是你所要做的。因为这是他指出我正确的方向,所以信赖Lou。
即使您自己编译并构建它,也不能在iPhone上使用libxslt。我已经这样做了,并且我的应用程序被拒绝了。 AppReview过程使用的工具不会区分代码中的静态链接符号和iOS中动态链接的符号。换句话说,如果看起来您使用的是libxslt,则您的应用程序将被拒绝,因为appstore无法分辨您是否使用私有API。
对于每个更新到XCode 5 + iOS7 baseSDK的人,您都会注意到,如果您在项目中包含libxslt-1.1.26
并从源代码进行编译,则会使用之前版本的libxml
。在最新的基础SDK libxml
已更新,因此您需要更新至libxslt-1.1.28
。
当您下载最新.tar.gz
文件都需要包含到项目中首次有:
config.h
libxslt/*.h
libxslt/*.c
但config.h
和libxslt/xsltconfig.h
现在还不存在。他们有.in
后缀。您将需要运行./configure
脚本,或者如果这不适合您,那么就会像我一样欺骗。
步骤1 - 0差异
只需创建的config.h.in
新副本名为config.h
。
第2步 - 12差异
只需创建的libxslt/xsltconfig.h.in
新副本名为libxslt/xsltconfig.h
。
前四个更改只是版本号。
#define LIBXSLT_DOTTED_VERSION "1.1.28"
#define LIBXSLT_VERSION 10128
#define LIBXSLT_VERSION_STRING "10128"
#define LIBXSLT_VERSION_EXTRA "-GITv1.1.28"
接下来的四个
#if @[email protected]
- >#if 1
//只需>#if 1
#if @[email protected]
- - 与1
#if @[email protected]
更换@[email protected]
>#if 0
#if @[email protected]
- >#if 1
最后四个
#if @[email protected]
- >#if 1
#define LIBXSLT_DEFAULT_PLUGINS_PATH() "@[email protected]"
- >#define LIBXSLT_DEFAULT_PLUGINS_PATH() "/usr/lib/libxslt-plugins"
#if @[email protected]
- >#if 1
#if @[email protected]
- >#if 0
步骤3
现在您已经手动执行的步骤是./configure
会执行,你可以请按照前面列出的说明添加libxslt
文件到您的项目:
config.h
libxslt/*.h
libxslt/*.c
- 1. XSLT版本1 URL编码
- 2. XSLT:深层子版本
- 3. iPhone SDK版本
- 4. Xcode,iphone版本
- 5. Iphone版本加密
- 6. 旧Iphone sdk版本
- 7. iphone编程中的版本控制
- 8. Android 2.1(及更早版本)支持XSLT?
- 9. XSLT版本1.0如何通过
- 10. 只需更改版本即可将Xslt 1.0更改为XSLT 2.0
- 11. iPhone - 如何检测iPhone版本?
- 12. iPhone发布版本崩溃
- 13. iphone部署版本要求
- 14. iPhone Lite版本升级
- 15. iPhone - 多个UIViewControllers版本
- 16. 如何在Xalan C++中打印Xalan支持的XSLT版本?
- 17. 如何从给定的XSLT文件中获取版本号。
- 18. iphone coredata xcdatamodel版本...是他们的版本限制?
- 19. 固件版本的iPhone/iPad通用版本问题
- 20. 关于iPhone本地化版本
- 21. iPhone Lite版本 - 什么是允许的?
- 22. 如何定位特定的iPhone版本?
- 23. 支持Iphone OS 3.1.2(7D11)的xcode版本?
- 24. 如何切换iPhone SDK的版本?
- 25. iPhone应用程序的测试版本
- 26. 测试各种版本的iPhone Safari
- 27. 如何下载旧版本的iPhone SDK?
- 28. iPhone/iPod Touch的目标版本为
- 29. 在早期版本发布之前提交新版本iphone
- 30. iPhone cocos2d游戏:测试版本与appstore版本不同
dylibs不允许在iPhone上。您需要创建一个静态库 – 2010-07-22 00:20:54
不幸的是,苹果会拒绝这个。请参阅下面的Chris Gilbert的评论。由于他们没有提供这个dylib的标题,他们认为它是一个私人框架,尽管它是一个公共图书馆。 – Jason 2010-11-25 16:06:05
在“xsltSaveResultToString(&xmlResultBuffer,&length,res,sty)”上获取EXC_BAD_ACCESS错误;“有任何想法吗? – docchang 2015-01-21 19:45:40