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