const wxString &XmlSchemaGenerator::generate ( Grammar::GrammarType grammarType, const wxString &filepath, const char *buffer, size_t len ) { mGrammarType = grammarType; mElements.clear(); mSchema.Clear(); XercesCatalogResolver catalogResolver; std::auto_ptr<XercesDOMParser> parser ( new XercesDOMParser() ); parser->setDoNamespaces ( true ); parser->setDoSchema ( true ); parser->setValidationSchemaFullChecking ( false ); parser->setEntityResolver ( &catalogResolver ); MemBufInputSource source ( ( const XMLByte * ) buffer, len, filepath.mb_str( wxConvLocal ) ); try { //XMLPlatformUtils::fgSSE2ok = false; parser->parse ( source ); } catch ( XMLException& e ) { mLastError = WrapXerces::toString ( e.getMessage() ); return mSchema; } xercesc::DOMDocument *doc = parser->getDocument(); if ( doc == NULL ) { mLastError = _ ("Failed to load xml file."); return mSchema; } size_t size = len / 3; if ( size > maxReservedSchemaBuffer ) size = maxReservedSchemaBuffer; mSchema.Alloc ( size ); if ( mGrammarType == Grammar::SchemaGrammarType ) mSchema << _T("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") << getEOL() << _T("<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">") << getEOL(); xercesc::DOMElement *root = doc->getDocumentElement(); if ( root != NULL ) { findAllElements ( *root ); generateData ( *root, 1 ); if ( mInlineSimpleType && mGrammarType == Grammar::SchemaGrammarType ) outputSchema ( *root ); } if ( mGrammarType == Grammar::SchemaGrammarType ) mSchema << _T("</xs:schema>") << getEOL(); mSchema.Shrink(); return mSchema; }
// makeToken {{{ int CLexer::makeToken() { //if(isEOF()) return ILexer::RET_EOF; CToken* token=NULL; int ret = ILexer::RET_NORMAL; // トークンの作成 while(token == NULL) { skipBlanks(); if(isComment()) { skipLine(); continue; } if( (token = getEOF()) != NULL){ret = ILexer::RET_EOF; break;} if( (token = getEOL()) != NULL){ret = ILexer::RET_EOL; nowLine_++;break;} // トークン取得開始 if( (token = getKeyword()) != NULL) break; if( (token = getOperator()) != NULL) break; if( (token = getIdentifier()) != NULL) break; if( (token = getLiteral('\'',false)) != NULL) break; if( (token = getLiteral('"',true)) != NULL) break; if( (token = getConstant()) != NULL) break; if( (token = getSeparator()) != NULL) break; // エラー処理 onAnalyzeError(); } topToken_ = token; makeTokenRet_ = ret; return ret; }
void XmlSchemaGenerator::generateDTD ( ElmtData &data, size_t WXUNUSED ( nIndent ) ) { wxString &schema = data.schema; schema.Alloc ( maxElementSchemaBuffer ); schema << _T("<!ELEMENT ") << data.name; if (data.sequence.empty()) { schema << _T(" (#PCDATA)"); } else { const wxChar *separator = _T(" ("); std::vector<wxString>::const_iterator seqItr; seqItr = data.sequence.begin(); if (data.useSequence) { for ( ; seqItr != data.sequence.end(); ++seqItr ) { schema << separator << *seqItr; separator = _T(", "); const ChildData &child = data.children[*seqItr]; if ( child.minOccurs == 0 ) schema << ( child.maxOccurs > 1 ? _T("*") : _T("?") ); else if ( child.maxOccurs > 1 ) schema << _T("+"); } schema << _T(")"); } else { size_t minTotal = 0; for ( ; seqItr != data.sequence.end(); ++seqItr ) { schema << separator << *seqItr; separator = _T(" | "); minTotal += data.children[*seqItr].maxOccurs; } schema << ( minTotal > 0 ? _T(")+") : _T(")*") ); } } schema << _T(">") << getEOL(); if ( !data.attrMap.empty() ) { const static wxString indent = wxString ( getEOL() ) + _T(" "); schema << _T("<!ATTLIST ") << data.name; std::map<wxString, const XMLCh *>::const_iterator attrItr; attrItr = data.attrMap.begin(); for ( ; attrItr != data.attrMap.end(); ++attrItr ) { schema << indent << attrItr->first << _T(" CDATA"); if ( attrItr->second != NULL ) // Has default value schema << _T(" \"") << WrapXerces::toString ( attrItr->second ) << _T("\""); else if ( data.optAttrs.find ( attrItr->first ) == data.optAttrs.end() ) schema << _T(" #REQUIRED"); else schema << _T(" #IMPLIED"); } schema << _T(">") << getEOL(); } schema.Shrink(); }
void XmlSchemaGenerator::generateSchema ( ElmtData &data, size_t nIndent ) { wxString &schema = data.schema; if ( data.children.empty() && data.attrMap.empty() ) { if ( !mInlineSimpleType ) { addIndent ( schema, nIndent ); schema << _T("<xs:element name=\"") << data.name << _T("\" type=\"xs:string\"/>") << getEOL(); } return; } schema.Alloc ( maxElementSchemaBuffer ); addIndent ( schema, nIndent++ ); schema << _T("<xs:element name=\"") << data.name << _T("\">") << getEOL(); if ( !data.children.empty() ) { addIndent ( schema, nIndent++ ); schema << _T("<xs:complexType>") << getEOL(); addIndent ( schema, nIndent++ ); size_t minOccurs = 1, maxOccurs = 1, minTotal = 0; std::map<wxString, ChildData>::const_iterator itr; for ( itr = data.children.begin(); itr != data.children.end(); ++itr ) { if ( itr->second.minOccurs < minOccurs ) minOccurs = itr->second.minOccurs; if ( itr->second.maxOccurs > maxOccurs ) maxOccurs = itr->second.maxOccurs; minTotal += itr->second.minOccurs; } if ( data.useSequence ) { schema << _T("<xs:sequence"); } else { schema << _T("<xs:choice maxOccurs=\"unbounded\""); } //if (minOccurs != 1) schema << _T(" minOccurs=\"") << minOccurs << _T("\""); //if (maxOccurs > 1) schema << _T(" maxOccurs=\"unbounded\""); if ( minTotal == 0 ) schema << _T(" minOccurs=\"0\""); schema << _T(">") << getEOL(); std::vector<wxString>::const_iterator seqItr; seqItr = data.sequence.begin(); for ( ; seqItr != data.sequence.end(); ++seqItr ) { const ChildData &child = data.children[*seqItr]; addIndent ( schema, nIndent ); if ( mInlineSimpleType ) { // Check if it's a simple type const ElmtData *childElmt = &mElements[*seqItr]; if ( childElmt->children.empty() && childElmt->attrMap.empty() ) { schema << _T("<xs:element name=\"") << *seqItr << _T("\" type=\"xs:string\"/>") << getEOL(); continue; } } schema << _T("<xs:element ref=\"") << *seqItr << _T("\""); if ( data.useSequence ) { if ( child.minOccurs == 0 ) { schema << _T(" minOccurs=\"0\""); } if ( child.maxOccurs > 1 ) { schema << _T(" maxOccurs=\"unbounded\""); } } schema << _T("/>") << getEOL(); } addIndent ( schema, --nIndent ); if ( data.useSequence ) { schema << _T("</xs:sequence>") << getEOL(); } else { schema << _T("</xs:choice>") << getEOL(); } } else if ( !data.attrMap.empty() ) { addIndent ( schema, nIndent++ ); schema << _T("<xs:complexType>") << getEOL(); } std::map<wxString, const XMLCh *>::const_iterator attrItr; attrItr = data.attrMap.begin(); for ( ; attrItr != data.attrMap.end(); ++attrItr ) { addIndent ( schema, nIndent ); schema << _T("<xs:attribute name=\"") << attrItr->first << _T("\" type=\"xs:string\""); if ( attrItr->second != NULL ) { schema << _T(" default=\"") << WrapXerces::toString ( attrItr->second ) << _T("\""); } else if ( data.optAttrs.find ( attrItr->first ) == data.optAttrs.end() ) { schema << _T(" use=\"required\""); } schema << _T("/>") << getEOL(); } addIndent ( schema, --nIndent ); schema << _T("</xs:complexType>") << getEOL(); addIndent ( schema, --nIndent ); schema << _T("</xs:element>") << getEOL(); schema.Shrink(); }