Я использую анализатор SAX2 Xerces-C ++ (версия 2.6.1) для проверки XML, такой как документ ниже.(Это MSML - язык разметки медиа-сервера, определенный в RFC 5707 .)
<?xml version="1.0" encoding="UTF-8"?>
<msml version="1.1">
<createconference name="example">
<audiomix>
<n-loudest n="3"/>
<asn ri="10s"/>
</audiomix>
</createconference>
</msml>
RFC предоставляет схемы XML для проверки MSML , и япытаясь использовать их в сочетании с анализатором Xerces SAX2 для проверки и анализа MSML.Синтаксический анализ работает нормально, но мне не удается получить какую-либо проверку.Я подозреваю, что моя проблема может быть из-за того, что MSML, который я пытаюсь проверить, не содержит атрибута schemaLocation
, но я не могу контролировать, какой XML я получаю - я бы хотел выполнить проверку с использованием msml.xsd, если schemaLocation
или noNamespaceSchemaLocation
(или ничего) предоставляется в XML.
Мой код похож на следующий.
SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
// Enable the parser's schema support
parser->setFeature(XMLUni::fgXercesSchema, true);
// Schema validation requires namespace processing to be turned on.
parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
// Define the location of the MSML schema.
XMLCh* schemaLocation = XMLString::transcode("/directory/path/msml-core.xsd");
parser->setProperty(XMLUni::fgXercesSchemaExternalNoNameSpaceSchemaLocation,
schemaLocation);
// MSMLHandler is defined elsewhere and inherits from xercesc/sax2/DefaultHandler
// It overrides startElement and fatalError.
MxMSMLHandler* msmlHandler = new MSMLHandler(xiSessionID, xoMSMLResponse);
parser->setContentHandler((ContentHandler*) msmlHandler);
parser->setErrorHandler((ErrorHandler*) msmlHandler);
// Do the parse
parser->parse(*xmlInputSource);