Я бы использовал libxml2 или одну из его реализаций на любом языке, который вы предпочитаете. То, как человек проверяет конкретный документ, зависит от используемого им диалекта XML. В настоящее время существует три общих проверочных механизма: DTD, RelaxNG и XML-схема, и каждый уважающий себя диалект производит по крайней мере один из них со своей спецификацией диалекта.
Следующая версия C для проверки документа MathML с использованием RelaXNG:
static const xmlChar
mml_rng_uri[] = "http://www.w3.org/Math/RelaxNG/mathml3/mathml3.rng";
/**
* @brief Validate the MathML document located at the given URI.
*/
/*
* -- Implementation notes --
*
* The goal is xmlRelaxGNValidateDoc.
* For that we need a xmlDocPtr for the document and xmlRelaxNGValidCtxtPtr
* for the RelaxNG schema.
* Given a uri we can use xmlCtxtReadFile for the document.
* We will also need a validation schema, which is always the result of a
* RelaxNG parse operation.
* The parse operation requires a parser context obtained from either
* xmlRelaxNGNewParserCtxt, which takes an URI or xmlRelaxNGNewMemParserCtxt
* which takes a pointer and size.
*
* -- Short hand --
* xmlRelaxNGValidateDoc()
* |
* |- xmlDocPtr = xmlCtxtReadFile()
* | |
* | |- xmlParserCtxtPtr = xmlNewParserCtxt()
* |
* |- xmlRelaxNGValidCtxtPtr = xmlRelaxNGNewValidCtxt()
* | |
* | |- xmlRelaxNGPtr = xmlRelaxNGParse()
* | | |
* | | |- xmlRelaxNGParserCtxtPtr = xmlRelaxNGNewParserCtxt()
* | | |- xmlRelaxNGParserCtxtPtr = xmlRelaxNGNewMemParserCtxt()
*/
int MML_validate(const char *uri)
{
xmlDocPtr doc;
xmlParserCtxtPtr docparser;
xmlRelaxNGValidCtxtPtr validator;
xmlRelaxNGPtr schema;
xmlRelaxNGParserCtxtPtr rngparser;
int retval;
/* RelaxNG schema setup */
rngparser = xmlRelaxNGNewParserCtxt(mml_rng_uri);
if( (schema = xmlRelaxNGParse(rngparser)) == NULL )
errx(1, "Failed to parse MathML RelaxNG schema");
if( (validator = xmlRelaxNGNewValidCtxt(schema)) == NULL )
errx(1, "Failed to create a RelaxNG validator");
/* MathML document setup */
if( (docparser = xmlNewParserCtxt()) == NULL )
errx(1, "Failed to create a document parser");
if( (doc = xmlCtxtReadFile(docparser, uri, NULL, XML_PARSE_XINCLUDE)) ==
NULL )
errx(1, "Failed to parse document at %s", uri);
/* Validation */
retval = xmlRelaxNGValidateDoc(validator, doc);
/* Clean up */
xmlRelaxNGFreeValidCtxt(validator);
xmlRelaxNGFreeParserCtxt(rngparser);
xmlRelaxNGFree(schema);
return(retval);
}