[Expat-discuss] Verify xml-file with dtd?

Mikael Ryding (LI/EAB) mikael.ryding at ericsson.com
Fri Mar 4 17:33:23 CET 2005


Hi!

I'm writing a program that uses EXPAT to parse an xml-file and to verify its structure with a dtd-file, but it ONLY verifies the syntax for the xml-ile and dtd-file separately, I don't manage to get the parser to compare the files and verify that the xml-file "implements" the dtd so to speak. I can use any valid DTD (that has nothing to do with my xml-file) and the parser finds it ok.


Does someone have an idea what I do wrong? Below is part of the code that includes the DTD-parts (everything else removed):
---------------------------

int dtdHandler (XML_Parser parser, const XML_Char *context,  const XML_Char *base,  
                      const XML_Char *systemId,  const XML_Char *publicId)
{
  XML_Parser dtdParser = XML_ExternalEntityParserCreate(parser, context, 0);
  status = XML_Parse(dtdParser, buf, len, 1);
  if (!status) {
    printf("dtdparsing: %s at line %d, column: %d, errorCode: %d\n",
           XML_ErrorString(XML_GetErrorCode(dtdParser)),
           XML_GetCurrentLineNumber(dtdParser),
           XML_GetCurrentColumnNumber(dtdParser));
    return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
  }
  return status; 
}
----------------------------
int main ()
{
  /* Set user data */
  XML_SetUserData(parser, fd_p);

  /* DTD parsing */
  XML_SetExternalEntityRefHandler(parser, dtdHandler);
  XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);

  /* Set element and character data handler */
  XML_SetElementHandler(parser, startElement, endElement);

  do {  
    if (!XML_Parse(parser, buf, len, len==0)) {
      printf("xmlparsing: %s at line %d, column: %d\n",
              XML_ErrorString(XML_GetErrorCode(parser)),
              XML_GetCurrentLineNumber(parser),
              XML_GetCurrentColumnNumber(parser));
 
    } 
}


Regards, Mikael


More information about the Expat-discuss mailing list