可以在运行时使用 Objc/iPhone 代码针对 xsd 验证 xml
Posted
技术标签:
【中文标题】可以在运行时使用 Objc/iPhone 代码针对 xsd 验证 xml【英文标题】:Possible to validate xml against xsd using Objc/iPhone code at runtime 【发布时间】:2012-02-14 22:01:23 【问题描述】:我有在运行时读取的 xml 文件,是否可以使用 Obj C 在运行时针对 xsd 文件验证 xml?这可以在java 和c# 中完成。但我需要在我的iphone 应用程序中运行它。
【问题讨论】:
【参考方案1】:我认为你不能在 ios 上使用 Obj C 来做到这一点。我认为您需要使用 libxml2。
Here's an example of a simple C program that validates XML against XSD.
Here are instructions on adding libxml2 to an XCode project.
【讨论】:
【参考方案2】:CodeSynthesis XSD/e 应该支持 iPhone(在 Mac 包内)
编辑#1:设置说明
要构建 XSD/e 运行时库 (libxsde.a),请执行以下步骤:
为 Mac OS X 解压预编译的 XSD/e 包。
启动一个新的终端窗口并运行以下命令:
cd xsde-3.2.0-i686-macosx
cp etc/ios/config-xcode.make config/config.make
不要关闭终端。
编辑 config/config.make
并调整 XSD/e 配置以适合您的
要求。
在终端中,执行:
cd libxsde
make
如果找不到 make 命令,请尝试 /Developer/usr/bin/make(或您的 替代 XCode 安装目录)。
启动 XCode 并执行以下步骤:
5.1 选择“文件”->“新建项目”
5.2 在打开的对话框中选择“iOS Library”->“Cocoa Touch Static 库”。点击“选择...”。
5.3 在下一个对话框中,在“另存为”字段中键入 libxsde 并导航 到 xsde-3.2.0-i686-macosx 目录。点击“保存”。
5.4 接下来您应该会看到一个警告对话框,指出 libxsde 目录 已经存在。这是预期的,因此请点击“替换”。
5.5 在项目窗口的“Groups & Files”列表中选择“Other Sources”组,然后选择“Project”->“Add to Project...”。
5.6 在打开的对话框中导航到 xsde-3.2.0-i686-macosx/libxsde 目录并 选择 src 目录。点击“添加”。
5.7 在下一个对话框中保留默认设置并单击“添加”。现在 您应该会看到列出的多个源文件(.cxx 和 .c) “其他来源”组。
5.8 接下来选择“Project”->“Edit Project Settings”,“Build”选项卡。在里面 “配置”下拉列表中选择“所有配置”。
5.9 向下滚动到“搜索路径”部分并添加 . (点)到 “标题搜索路径”字段。
5.10 向下滚动到“GCC 4.2 - 语言”部分并添加 -fvisibility=hidden 标志到“其他 C 标志”字段 作为 -fvisibility=hidden 和 -fvisibility-inlines-hidden 标志 到“其他 C++ 标志”字段。如果您设置任何额外的 C/C++ 标志 在应用程序的项目中,您可能还想在此处添加它们。
5.11 为所有需要的配置构建项目(例如, 调试/发布、设备/模拟器、ARMv6/ARMv7等)。
在终端窗口中通过运行以下命令创建“胖”库 命令(可能需要根据配置进行调整 你已经建立):
cd build
lipo -output libxsde.a -create Release-iphonesimulator/liblibxsde.a Release-iphoneos/liblibxsde.a
lipo -output libxsde-d.a -create Debug-iphonesimulator/liblibxsde.a Debug-iphoneos/liblibxsde.a
如果在某些时候您需要更改 XSD/e 配置,那么最好 从头开始(上面的步骤 1),因为添加的文件集 XCode 项目可能因配置而异。
构建运行时库后,将 XSD/e 集成到您的应用程序中 执行以下步骤:
使用 XSD/e 编译器 (xsde-3.2.0-i686-macosx/bin/xsde) 将架构编译为 C++ 并将生成的 C++ 文件添加到您的项目中。
要将您的应用程序链接到 XSD/e 运行时库 (libxsde),请执行 在您的项目中执行以下步骤:
2.1 在“目标”组中,双击您的应用程序以打开 “信息”对话框。
2.2 选择“常规”选项卡并单击加号 (+) 按钮添加 图书馆。
2.3 在打开的对话框中单击“添加其他...”按钮并添加 上面创建的 libxsde.a 或 libxsde-d.a(调试)fat 库。
要将 XSD/e 运行时标头添加到应用程序的搜索路径, 在您的项目中执行以下步骤:
3.1 选择“Project”->“Edit Project Settings”,“Build”选项卡。在里面 “配置”下拉列表中选择“所有配置”。
3.2 向下滚动到“搜索路径”部分并将路径添加到 xsde-3.2.0-i686-macosx/libxsde 目录到“Header Search Paths”字段。
3.3 构建应用程序。
【讨论】:
我一直在寻找有关如何将其与 iPhone 应用程序集成的教程,但找不到任何东西。你还知道什么吗? wiki.codesynthesis.com/Using_XSDE_in_iPhone_Applications你也可以看看维基。【参考方案3】:在 iOS 的 objC Api 中没有用于此的 sdks。为此,您必须直接使用 libxml 的 C API。
-
您加载 xml(例如 xmlReadMemory)
那么对于 XSD,您将使用 xmlSchemaValidateDoc
或者您可以使用以下包装类 [免责声明:我是作者]: DDXMLValidator(部分我的助手@https://github.com/Daij-Djan/DDUtils/)
//validate
NSError *error = nil;
NSURL *schemaURL = [[NSBundle mainBundle] URLForResource:@"XMLSchema" withExtension:@"xsd"];
if(![[SNXMLValidator sharedInstace] validateXMLData:xmlData withSchema:SNXMLValidatorSchemaTypeXSD schemaFile:schemaURL error:&error])
DebugLog(@"Failed to validate data: %@", error);
该类可以做 DTD、XSD、RelaxNG(它只是包装了 libxml2)
【讨论】:
非常好!这看起来很有帮助。以上是关于可以在运行时使用 Objc/iPhone 代码针对 xsd 验证 xml的主要内容,如果未能解决你的问题,请参考以下文章