2012-06-22 58 views
3

我想根据iOS上的XSD验证XML文件。文档暗示使用NSXMLDocument来做到这一点,但它不适用于iOS =(。有没有轻量级的替代方案可以在iOS上做到这一点?iOS上的XSD验证

回答

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; 
} 
+0

我猜的链接是死。任何教程仍然可以在其他地方生活的机会? – miho

+0

已有示例代码的更新答案。任何人想解释downvotes或只是由于deadlink? – JoeyJ

+0

感谢您的示例。不知道,不是我。 – miho

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

我真的只是拉从堆栈溢出问题的联系和思想在这一点上,虽然

+0

是的,我确实看到了CodeSynthesis,虽然我是不是疯了吧,因为它的GPL和设置使用iOS中似乎已经过时,难以遵循=/ – JoeyJ