3

我一直在尝试使用我的 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;
}

谢谢,普里扬卡

4

2 回答 2

1

通过阅读xmllint.c源代码,您可以在上下文中为错误和警告设置回调,使用xmlSchemaSetValidErrors. 在最简单的情况下,您转发fprintf它只会打印错误。

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

UTSL :)

于 2012-09-18T13:19:57.617 回答
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);
  }
于 2012-09-17T09:35:41.900 回答