2010-12-07 19 views
1

Xerces-C++(バージョン2.6.1)SAX2パーサーを使用して、以下のようなXMLを検証しています。 (これはMSMLある - 。RFC 5707で定義されたメディアサーバマークアップ言語)Xercesを使用してスキーマを定義していないXMLを検証する

<?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 schemas for validating MSMLを提供し、私はMSMLを検証し、解析するXercesのSAX2パーサと一緒にそれらを使用しようとしています。解析は正常に動作していますが、検証はできません。検証しようとしているMSMLにschemaLocation属性が含まれていないため、私が受け取ったXMLを制御できないため、問題が発生している可能性があります。または何も)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); 

答えて

2

そして周り暴れる多くの試行錯誤と、私は最終的に問題を発見しました。検証エラーは、パーサーに渡されたErrorHandlererrorコールバックに報告されます。 schemaLocation属性に問題はありませんでした。

これを修正し、パフォーマンスを向上させるために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); 

// Cache the XML grammar and use it for subsequent parses. 
mParser->setFeature(XMLUni::fgXercesCacheGrammarFromParse, true); 
mParser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, 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, fatalError *and error*. 
MxMSMLHandler* msmlHandler = new MSMLHandler(xiSessionID, xoMSMLResponse); 
parser->setContentHandler((ContentHandler*) msmlHandler); 
parser->setErrorHandler((ErrorHandler*) msmlHandler); 

// Do the parse 
parser->parse(*xmlInputSource); 
関連する問題