2010-12-07 2 views
1

Xerces-C++ (버전 2.6.1) SAX2 파서를 사용하여 아래 문서와 같은 XML의 유효성을 검사합니다.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 파서와 함께이를 사용하려고 해요 - (RFC 5707에 정의 된 미디어 서버 마크 업 언어.이 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); 

답변

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); 
관련 문제