我想针对 iOS 上的 XSD 验证 XML 文件。文档提到使用 NSXMLDocument 来执行此操作,但它在 iOS 上不可用 =(。在 iOS 上是否有任何轻量级的替代方案可以做到这一点?
问问题
2154 次
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 回答