private URTComplexType ParseComplexType(URTNamespace parsingNamespace, String typeName)
{
Util.Log("SdlParser.ParseComplexType NS "+parsingNamespace+" typeName "+typeName);
// Lookup the name of the type and the base type from which it derives
if(typeName == null)
typeName = LookupAttribute(s_nameString, null, true);
URTComplexType parsingComplexType = parsingNamespace.LookupComplexType(typeName);
if(parsingComplexType == null)
{
parsingComplexType = new URTComplexType(typeName, parsingNamespace.Namespace,
parsingNamespace.EncodedNS, _blockDefault,
false, typeName != null);
parsingNamespace.AddComplexType(parsingComplexType);
}
String baseType = LookupAttribute(s_baseString, null, false);
if(!MatchingStrings(baseType, s_emptyString))
{
String baseNS = ParseQName(ref baseType);
//if the type exists can this occur twice.
parsingComplexType.Extends(baseType, baseNS);
}
if(parsingComplexType.Fields.Count > 0)
{
SkipXmlElement();
}
else
{
int curDepth = _XMLReader.Depth;
ReadNextXmlElement();
int fieldNum = 0;
String elementName;
while(_XMLReader.Depth > curDepth)
{
elementName = _XMLReader.LocalName;
if(MatchingStrings(elementName, s_elementString))
{
ParseElementField(parsingNamespace, parsingComplexType, fieldNum);
++fieldNum;
continue;
}
else if(MatchingStrings(elementName, s_attributeString))
{
ParseAttributeField(parsingNamespace, parsingComplexType);
continue;
}
else if(MatchingStrings(elementName, s_allString))
{
parsingComplexType.BlockType = SchemaBlockType.ALL;
}
else if(MatchingStrings(elementName, s_sequenceString))
{
parsingComplexType.BlockType = SchemaBlockType.SEQUENCE;
}
else if(MatchingStrings(elementName, s_choiceString))
{
parsingComplexType.BlockType = SchemaBlockType.CHOICE;
}
else
{
// Ignore others elements such as annotations
SkipXmlElement();
continue;
}
// Read next element
ReadNextXmlElement();
}
}
return(parsingComplexType);
}