Рекомендация по языку для проверки XML - PullRequest
0 голосов
/ 09 мая 2011

Я хочу создать валидатор XML-документа.Программа, которая просматривает XML-документ и ищет повторение и согласованность атрибутов на основе определенных шаблонов (не то, чтобы XML соответствовал стандарту, но атрибуты соответствуют определенным правилам).

У меня есть опыт работы с:

  • Java
  • Perl
  • Groovy
  • C #
  • C

На каком языке/ библиотека / расширение вы бы порекомендовали для такой задачи?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2011

Слишком короткое изложение требований, чтобы сделать однозначное утверждение, но для меня это звучит как проблема с Схематроном.

0 голосов
/ 09 мая 2011

Я бы использовал 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);
}
...