2012-09-17 65 views
3

我一直在嘗試使用C代碼中的模式文件來驗證XML文件。驗證成功發生,說明文件是有效還是無效。如何使用libxml2以C編程語言使用模式文件驗證xml文件

但我的問題是它只打印有效/無效。應該有一個關於xml文件中缺少的情況的報告/輸出,以防它失效。可能類似於XML文件中的行號。

希望,我已經讓自己清楚。

這裏是我的C代碼: -

int validateXmlFile() 
{ 
    int iError = 0; 
    xmlDocPtr pDoc; 
    xmlDocPtr pSchemaDoc; 
    xmlSchemaParserCtxtPtr pSchemaCtxt; 
    xmlSchemaPtr pSchema; 
    xmlSchemaValidCtxtPtr pValidCtxt; 
    char * xmlFilename = "C:\\Documents and Settings\\pbhatia\\Desktop\\Schema\\ipt_config.xml"; 
    char * schemaFilename = "C:\\Documents and Settings\\pbhatia\\Desktop\\Schema\\ipt_config.xsd"; 

    PRNT(printf("Schema file : %s \n", schemaFilename)); 
    PRNT(printf("XML file : %s \n", xmlFilename)); 

    pDoc = xmlReadFile(xmlFilename, NULL, XML_PARSE_NONET); 
    if (!pDoc) 
     return -1; 

    pSchemaDoc = xmlReadFile(schemaFilename, NULL, XML_PARSE_NONET); 
    if (!pSchemaDoc) 
     return -2; 

    pSchemaCtxt = xmlSchemaNewDocParserCtxt(pSchemaDoc); 
    if (!pSchemaCtxt) 
     return -3; 

    pSchema = xmlSchemaParse(pSchemaCtxt); 
    if (!pSchema) 
     return -4; 

    pValidCtxt = xmlSchemaNewValidCtxt(pSchema); 
    if(!pValidCtxt) 
     return -5; 

    // Attempting to validate xml with schema 
    xmlSchemaFreeParserCtxt(pSchemaCtxt); 
    xmlFreeDoc(pSchemaDoc); 

    iError = xmlSchemaValidateDoc(pValidCtxt, pDoc); 
     if (iError == 0) 
     PRNT(printf("Document in %s is valid \n", xmlFilename)); 
    else 
     PRNT(printf("Document in %s is NOT valid \n", xmlFilename)); 

    xmlSchemaFree(pSchema); 
    xmlFreeDoc(pDoc); 
    return 0; 
} 

感謝, 普里

回答

1

從閱讀xmllint.c源代碼可知,您可以使用xmlSchemaSetValidErrors在上下文中爲錯誤和警告設置回調。在最簡單的情況下,你轉發fprintf,它只會打印錯誤。

xmlSchemaSetValidErrors(ctxt, 
    (xmlSchemaValidityErrorFunc) fprintf, 
    (xmlSchemaValidityWarningFunc) fprintf, 
    stderr); 

UTSL :)

+0

請您提供一個相同的示例代碼。 –

+0

他們在另一個SO問題:[libxml2獲取驗證錯誤](http://stackoverflow.com/questions/12107423/libxml2-get-validation-errors) – Jarekczek

+0

執行所需的功能後,我能夠得到錯誤/警告。但它並沒有顯示xml文件在哪一行發生錯誤(即驗證失敗)。我們能做到這一點怎麼樣? –

0

不回答你的schame一部分,但回答你 「裏找」 錯誤:

FILE *f = fopen("/temp/xml_err.log", "a"); 

    xmlDocPtr doc; 
    if (f) { 
    xmlSetGenericErrorFunc(f, NULL); 
    } 
    doc = xmlParseMemory(xmlstr, XMLMAXSTRSIZE); 
    if (f) { 
    fclose(f); 
    } 
相關問題