void XSDSchemaParser::parseXSD(const pt::ptree &keys) { for (auto it = keys.begin(); it != keys.end(); ++it) { // // Element parent (a type in realilty) and the element name help figure out how to process the XSD schema element std::string elemType = it->first; if (elemType == "xs:include") { std::string schemaFile = getXSDAttributeValue(it->second, "<xmlattr>.schemaLocation"); if (m_pSchemaItem->addUniqueName(schemaFile)) { parseXSD(schemaFile); } } else if (elemType == "xs:simpleType") { parseSimpleType(it->second); } else if (elemType == "xs:complexType") { parseComplexType(it->second); } else if (elemType == "xs:attributeGroup") { parseAttributeGroup(it->second); } else if (elemType == "xs:attribute") { parseAttribute(it->second); } else if (elemType == "xs:sequence") { parseXSD(it->second.get_child("", pt::ptree())); } else if (elemType == "xs:element") { parseElement(it->second); } else if (elemType == "xs:key") { parseKey(it->second); } else if (elemType == "xs:keyref") { parseKeyRef(it->second); } } }
bool Parser::parseSchemaTag( ParserContext *context, const QDomElement &root ) { QName name(root.tagName()); if ( name.localName() != QLatin1String("schema") ) { qDebug() << "ERROR localName=" << name.localName(); return false; } // Already done by caller when coming from type.cpp, but doesn't hurt to do twice context->namespaceManager()->enterChild(root); // This method can call itself recursively, so save/restore the member attribute. QString oldNamespace = d->mNameSpace; if ( root.hasAttribute( QLatin1String("targetNamespace") ) ) d->mNameSpace = root.attribute( QLatin1String("targetNamespace") ); if (root.attribute( QLatin1String("elementFormDefault") ) == QLatin1String("qualified")) d->mDefaultQualifiedElements = true; if (root.attribute( QLatin1String("attributeFormDefault") ) == QLatin1String("qualified")) d->mDefaultQualifiedAttributes = true; // mTypesTable.setTargetNamespace( mNameSpace ); QDomElement element = root.firstChildElement(); while ( !element.isNull() ) { NSManager namespaceManager( context, element ); const QName name( element.tagName() ); if (debugParsing()) qDebug() << "Schema: parsing" << name.localName(); if ( name.localName() == QLatin1String("import") ) { parseImport( context, element ); } else if ( name.localName() == QLatin1String("element") ) { addGlobalElement( parseElement( context, element, d->mNameSpace, element ) ); } else if ( name.localName() == QLatin1String("complexType") ) { ComplexType ct = parseComplexType( context, element ); d->mComplexTypes.append( ct ); } else if ( name.localName() == QLatin1String("simpleType") ) { SimpleType st = parseSimpleType( context, element ); d->mSimpleTypes.append( st ); } else if ( name.localName() == QLatin1String("attribute") ) { addGlobalAttribute( parseAttribute( context, element, d->mNameSpace ) ); } else if ( name.localName() == QLatin1String("attributeGroup") ) { d->mAttributeGroups.append( parseAttributeGroup( context, element, d->mNameSpace ) ); } else if ( name.localName() == QLatin1String("group") ) { d->mGroups.append( parseGroup( context, element, d->mNameSpace ) ); } else if ( name.localName() == QLatin1String("annotation") ) { d->mAnnotations = parseAnnotation( context, element ); } else if ( name.localName() == QLatin1String("include") ) { parseInclude( context, element ); } else { qWarning() << "Unsupported schema element" << name.localName(); } element = element.nextSiblingElement(); } if (!resolveForwardDeclarations()) return false; d->mNameSpace = oldNamespace; return true; }
bool Parser::parseSchemaTag( ParserContext *context, const QDomElement &root ) { QName name = root.tagName(); if ( name.localName() != QLatin1String("schema") ) return false; NSManager *parentManager = context->namespaceManager(); NSManager namespaceManager; // copy namespaces from wsdl if ( parentManager ) namespaceManager = *parentManager; context->setNamespaceManager( &namespaceManager ); QDomNamedNodeMap attributes = root.attributes(); for ( int i = 0; i < attributes.count(); ++i ) { QDomAttr attribute = attributes.item( i ).toAttr(); if ( attribute.name().startsWith( QLatin1String("xmlns:") ) ) { QString prefix = attribute.name().mid( 6 ); context->namespaceManager()->setPrefix( prefix, attribute.value() ); } } if ( root.hasAttribute( QLatin1String("targetNamespace") ) ) d->mNameSpace = root.attribute( QLatin1String("targetNamespace") ); // mTypesTable.setTargetNamespace( mNameSpace ); QDomElement element = root.firstChildElement(); while ( !element.isNull() ) { QName name = element.tagName(); if ( name.localName() == QLatin1String("import") ) { parseImport( context, element ); } else if ( name.localName() == QLatin1String("element") ) { addGlobalElement( parseElement( context, element, d->mNameSpace, element ) ); } else if ( name.localName() == QLatin1String("complexType") ) { ComplexType ct = parseComplexType( context, element ); d->mComplexTypes.append( ct ); } else if ( name.localName() == QLatin1String("simpleType") ) { SimpleType st = parseSimpleType( context, element ); d->mSimpleTypes.append( st ); } else if ( name.localName() == QLatin1String("attribute") ) { addGlobalAttribute( parseAttribute( context, element ) ); } else if ( name.localName() == QLatin1String("attributeGroup") ) { d->mAttributeGroups.append( parseAttributeGroup( context, element ) ); } else if ( name.localName() == QLatin1String("annotation") ) { d->mAnnotations = parseAnnotation( context, element ); } else if ( name.localName() == QLatin1String("include") ) { parseInclude( context, element ); } element = element.nextSiblingElement(); } context->setNamespaceManager( parentManager ); d->mNamespaces = joinNamespaces( d->mNamespaces, namespaceManager.uris() ); d->mNamespaces = joinNamespaces( d->mNamespaces, QStringList( d->mNameSpace ) ); resolveForwardDeclarations(); return true; }