3

我想针对 iOS 上的 XSD 验证 XML 文件。文档提到使用 NSXMLDocument 来执行此操作,但它在 iOS 上不可用 =(。在 iOS 上是否有任何轻量级的替代方案可以做到这一点?

4

3 回答 3

3

我最终使用了 libxml2 中的验证工具,因为它的库已经包含在 iOS 中。遵循此示例代码

#include <libxml/parser.h>
#include <libxml/xmlschemas.h>

int is_valid(const xmlDocPtr doc, const char *schema_filename)
{
    xmlDocPtr schema_doc = xmlReadFile(schema_filename, NULL, XML_PARSE_NONET);
    if (schema_doc == NULL) {
        /* the schema cannot be loaded or is not well-formed */
        return -1;
    }
    xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(schema_doc);
    if (parser_ctxt == NULL) {
        /* unable to create a parser context for the schema */
        xmlFreeDoc(schema_doc);
        return -2;
    }
    xmlSchemaPtr schema = xmlSchemaParse(parser_ctxt);
    if (schema == NULL) {
        /* the schema itself is not valid */
        xmlSchemaFreeParserCtxt(parser_ctxt);
        xmlFreeDoc(schema_doc);
        return -3;
    }
    xmlSchemaValidCtxtPtr valid_ctxt = xmlSchemaNewValidCtxt(schema);
    if (valid_ctxt == NULL) {
        /* unable to create a validation context for the schema */
        xmlSchemaFree(schema);
        xmlSchemaFreeParserCtxt(parser_ctxt);
        xmlFreeDoc(schema_doc);
        return -4; 
    }
    int is_valid = (xmlSchemaValidateDoc(valid_ctxt, doc) == 0);
    xmlSchemaFreeValidCtxt(valid_ctxt);
    xmlSchemaFree(schema);
    xmlSchemaFreeParserCtxt(parser_ctxt);
    xmlFreeDoc(schema_doc);
    /* force the return value to be non-negative on success */
    return is_valid ? 1 : 0;
}
于 2012-10-16T03:10:05.360 回答
0

似乎在Objective C中做到这一点并不容易,但是在这个SO问题中列出了几个想法:Possible to validate xml against xsd using Objc/iPhone code at runtime

似乎 CodeSynthesis 在这里支持这一点:http ://wiki.codesynthesis.com/Using_XSDE_in_iPhone_Applications

不过,此时我真的只是从 Stack Overflow 问题中提取链接和想法。

于 2012-06-22T20:38:25.710 回答
0

没有通用的模式验证器。尝试使用上面建议的 XSDE。它非常快,非常非常可靠。

不错的教程在这里:http ://amaturitsolutions.blogspot.hu/2012/10/validate-xsd-schema-in-your-ios.html

于 2012-10-14T10:32:05.173 回答