Проверка схемы XML Xerces-C не работает - PullRequest
1 голос
/ 03 мая 2011

Попытка заставить Xerces-C проверить XML-файл по файлу схемы, но безуспешно.Приведенный ниже конструктор принимает местоположение файла XML и файла схемы и устанавливает соответствующие переменные-члены:

Config::Config(const std::string& schemaFile, const std::string& XMLFile)
    : m_schemaFile(schemaFile),
      m_XMLFile(XMLFile)
{

    {
        //initialize
        try
        {
            xercesc::XMLPlatformUtils::Initialize();
            xalanc::XPathEvaluator::initialize();
        }
        catch (xercesc::XMLException& e)
        {
            throw XercesInitialisationException();
        }
    }

    {
        //validate XML
        xercesc::XercesDOMParser m_domParser;
        if (NULL == m_domParser.loadGrammar(m_schemaFile.c_str(), xercesc::Grammar::SchemaGrammarType))
        {
            //schema file could not be loaded
            throw SchemaLoadException();
        }

        ParserErrorHandler errorHandler;
        m_domParser.setErrorHandler(&errorHandler);
        m_domParser.setDoNamespaces(true);
        m_domParser.setDoSchema(true);
        m_domParser.setValidationConstraintFatal(true);
        m_domParser.setValidationSchemaFullChecking(true);

        m_domParser.parse(m_XMLFile.c_str());

        if (NULL == m_domParser.getDocument() || NULL == m_domParser.getDocument()->getDocumentElement())
        {
            throw XMLLoadException();
        }

        if (0 == m_domParser.getErrorCount())
        {
            std::cout << "Number of schema validation errors: " << m_domParser.getErrorCount() << std::endl;
        }
        else
        {
            //m_validated unsuccessfully against the schema
            throw SchemaValidationException();
        }
    }

    {
        //set up XPath interpreter
        const xalanc::XalanDOMString m_xalanXMLFile(m_XMLFile.c_str());
        const xercesc::LocalFileInputSource m_xalanInputSource(m_xalanXMLFile.c_str());

        // Initialise XalanSourceTree subsystem...
        xalanc::XalanSourceTreeInit sourceTreeInit;
        m_liaison = std::auto_ptr<xalanc::XalanSourceTreeParserLiaison>(new xalanc::XalanSourceTreeParserLiaison(m_domSupport));
        m_domSupport.setParserLiaison(m_liaison.get());
        m_document = m_liaison->parseXMLStream(m_xalanInputSource);
        m_prefixResolver = std::auto_ptr<xalanc::XalanDocumentPrefixResolver>(new xalanc::XalanDocumentPrefixResolver(m_document));
        m_evaluator = std::auto_ptr<xalanc::XPathEvaluator>(new xalanc::XPathEvaluator);
    }
}

Область конструктора, в которой настроен синтаксический анализ XML, показана ниже.Вот где я думаю, что проблема заключается в следующем:

//validate XML
        xercesc::XercesDOMParser m_domParser;
        if (NULL == m_domParser.loadGrammar(m_schemaFile.c_str(), xercesc::Grammar::SchemaGrammarType))
        {
            //schema file could not be loaded
            throw SchemaLoadException();
        }

        ParserErrorHandler errorHandler;
        m_domParser.setErrorHandler(&errorHandler);
        m_domParser.setDoNamespaces(true);
        m_domParser.setDoSchema(true);
        m_domParser.setValidationConstraintFatal(true);
        m_domParser.setValidationSchemaFullChecking(true);

        m_domParser.parse(m_XMLFile.c_str());

        if (NULL == m_domParser.getDocument() || NULL == m_domParser.getDocument()->getDocumentElement())
        {
            throw XMLLoadException();
        }

        if (0 == m_domParser.getErrorCount())
        {
            std::cout << "Number of schema validation errors: " << m_domParser.getErrorCount() << std::endl;
        }
        else
        {
            //m_validated unsuccessfully against the schema
            throw SchemaValidationException();
        }

Когда код компилируется и запускается, все работает, но в XML не выполняется проверка на соответствие схеме.Это означает, что XML анализируется, даже если он не соответствует схеме.После проверки я также смог убедиться, что значение errorCount остается равным 0 для всех схем.

1 Ответ

0 голосов
/ 08 октября 2014

Вы должны ссылаться на схему в корневом узле xml следующим образом:

<rootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="Schema.xsd">
...