可以在运行时使用 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的主要内容,如果未能解决你的问题,请参考以下文章

为什么用泛型?

如何在 IronPython 2.7 中引用针对运行时版本“v2.0.xxx”构建的程序集?

针对windows的linux c++代码修改

Xcode的多个副本-针对iOS的较早版本测试代码

针对IF语句测试范围值数组的最佳方法

使用performance工具分析运行时性能