可以在运行时使用Objc / iPhone代码对xsd验证xml

时间:2012-01-20 10:07:51

标签: iphone objective-c xml cocoa-touch xsd

我有运行时读入的xml文件,是否可以在运行时使用Obj C ??对xsd文件验证xml?这可以在javac#中完成。但我需要在我的iphone应用中运行它。

3 个答案:

答案 0 :(得分:6)

我不认为你可以在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.

答案 1 :(得分:1)

CodeSynthesis XSD/e 应该支持iPhone(在Mac包内)


编辑#1:设置说明

要构建XSD / e运行时库(libxsde.a),请执行以下步骤:

  1. 为Mac OS X打开预编译的XSD / e包。

  2. 启动新的终端窗口并运行以下命令:

    cd xsde-3.2.0-i686-macosx

    cp etc/ios/config-xcode.make config/config.make

    请勿关闭终端。

  3. 修改config/config.make并调整XSD / e配置以适合您的需要 要求。

  4. 在终端中,执行:

    cd libxsde

    make

    如果找不到make命令,请尝试/ Developer / usr / bin / make(或者你的 替代XCode安装目录)。

  5. 启动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     来源“分组,然后选择”项目“ - >”添加到项目...“。

    5.6在打开的对话框中,导航到xsde-3.2.0-i686-macosx / libxsde目录并     选择src目录。点击“添加”。

    5.7在下一个对话框中,保留默认设置并单击“添加”。现在     你应该看到中列出的多个源文件(.cxx和.c)     “其他来源”组。

    5.8接下来选择“项目” - >“编辑项目设置”,“构建”选项卡。在里面     “配置”下拉列表选择“所有配置”。

    5.9向下滚动到“搜索路径”部分并添加。 (点)到     “标题搜索路径”字段。

    5.10向下滚动到“GCC 4.2 - 语言”部分并添加      -fvisibility =“其他C标志”字段的隐藏标志      作为-fvisibility = hidden和-fvisibility-inlines-hidden标志      到“其他C ++标志”字段。如果您设置任何额外的C / C ++标志      在您的应用程序的项目中,您可能还想在此处添加它们。

    5.11为所有需要的配置构建项目(例如,      调试/发布,设备/模拟器,ARMv6 / ARMv7等)。

  6. 在终端窗口中,运行以下命令创建“fat”库 命令(可能需要根据配置进行调整) 你已经建立了):

    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

  7. 如果在某些时候您需要更改XSD / e配置,那么最好 从添加的文件集开始,从头开始(上面的步骤1) XCode项目可能因配置而异。

    构建运行时库后,将XSD / e集成到应用程序中 执行以下步骤:

    1. 使用XSD / e编译器将模式编译为C ++(xsde-3.2.0-i686-macosx / bin / xsde) 并将生成的生成的C ++文件添加到项目中。

    2. 要将您的应用程序链接到XSD / e运行时库(libxsde),请执行 项目中的以下步骤:

      2.1在“目标”组中,双击您的应用程序以打开     “信息”对话框。

      2.2选择“常规”选项卡,然后单击加号(+)按钮添加     库。

      2.3在打开的对话框中,单击“添加其他...”按钮并添加其中一个     上面创建的libxsde.a或libxsde-d.a(调试)胖库。

    3. 要将XSD / e运行时标头添加​​到应用程序的搜索路径, 在您的项目中执行以下步骤:

      3.1选择“项目” - >“编辑项目设置”,“构建”选项卡。在里面     “配置”下拉列表选择“所有配置”。

      3.2向下滚动到“搜索路径”部分,然后添加路径     xsde-3.2.0-i686-macosx / libxsde目录到“Header Search Paths”字段。

      3.3构建应用程序。

答案 2 :(得分:1)

在iOS的objC Api中没有这方面的问题。要做到这一点,你必须直接使用libxml的C API。

  1. 您加载了xml(例如xmlReadMemory)
  2. 然后对于XSD,您将使用xmlSchemaValidateDoc
  3. 或者您可以使用以下包装类[免责声明:我是作者]:
    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)