使用Xerces对XSD验证XML(不仅仅是语法)

时间:2017-12-07 10:05:54

标签: xml validation xsd xerces

我正在尝试为我正在工作的项目编写一个快速且脏的XML验证器。我目前正在使用Xerces C ++。

使用XercesDOMParser很容易根据提供的XSD架构验证xml的语法,但这只是我想要的部分。

我希望能够验证这些值。

因此,例如,如果XSD架构指定值必须是xs:date

<xs:element name="DOB" type="xs:date"/>

但XML只包含(例如)随机字符串,例如

<DOB>banana</DOB>    

我希望将其标记为错误。

这种形式的验证是否可以使用Xerces?

编辑:

这是我对ErrorHandler的重写:

class MyErrorHandler : public ErrorHandler
{
public :
    virtual void warning(const SAXParseException& exc);
    virtual void error(const SAXParseException& exc);
    virtual void fatalError(const SAXParseException& exc);
    virtual void resetErrors();
};

void MyErrorHandler::warning(const SAXParseException& exc)
{
    std::cout << "WARNING\n";
}

void MyErrorHandler::error(const SAXParseException& exc)
{
    std::cout << "ERROR\n";
}

void MyErrorHandler::fatalError(const SAXParseException& exc)
{
    char* message = xercesc::XMLString::transcode(exc.getMessage());
    std::cout << "Fatal " <<  message << " at line " << exc.getLineNumber() << " column " << exc.getColumnNumber() << std::endl;
    xercesc::XMLString::release(&message);
}

这是主要的:

int main(int argc, char **argv)
{
    if (argc == 3)
    {
        struct stat buffer;

        if ( (stat(argv[1], &buffer) == 0) && (stat(argv[2], &buffer) == 0))
        {
            try {
                XMLPlatformUtils::Initialize();
            }
            catch (const XMLException& toCatch) {
                return 1;
            }

            XercesDOMParser* parser = new XercesDOMParser();
            parser->setExternalNoNamespaceSchemaLocation(argv[1]);
            parser->setExitOnFirstFatalError(true);
            parser->setValidationConstraintFatal(true);
            parser->setValidationScheme(XercesDOMParser::Val_Auto);
            parser->setDoNamespaces(false);
            parser->setDoSchema(true);
            parser->setValidationSchemaFullChecking(true);

            MyErrorHandler errorHandler;

            parser->setErrorHandler(&errorHandler);

            std::string xmlFile(argv[2]);

            try {
                parser->parse(xmlFile.c_str());
            }
            catch (const DOMException& e)
            {
                std::cout << "DOM Exception.." << std::endl;
            }
            catch (const SAXException& e)
            {
                std::cout << "SAX Exception.." << std::endl;
            }
            catch (const XMLException& e)
            {
                std::cout << "XML Exception.." << std::endl;
            }
            XMLPlatformUtils::Terminate();
        }
        else
        {
            std::cerr << "XSD/XML file absent\n";
        }
    }
    else
    {
        std::cerr << "Incorrect number of arguments - Usage : " << argv[0] << " <sample schema> <sample xml>\n";
    }
}

0 个答案:

没有答案