private void ParseAttributeField(URTNamespace parsingNamespace,
URTComplexType parsingComplexType)
{
Util.Log("SdlParser.ParseAttributeField NS "+parsingNamespace);
// Lookup field name
String attrTypeName, attrTypeNS;
String attrName = LookupAttribute(s_nameString, null, true);
// Check if the field is optional
bool bOptional = false;
String minOccurs = LookupAttribute(s_minOccursString, null, false);
if(MatchingStrings(minOccurs, s_zeroString))
bOptional = true;
// Handle anonymous types
bool bEmbedded, bPrimitive;
if(_XMLReader.IsEmptyElement == true)
{
// Non-anonymous type case and type has to present
attrTypeName = LookupAttribute(s_typeString, null, true);
ResolveTypeAttribute(ref attrTypeName, out attrTypeNS,
out bEmbedded, out bPrimitive);
// Read next element
ReadNextXmlElement();
// Check for xsd:ID type
if(MatchingStrings(attrTypeName, s_idString) &&
MatchingStrings(attrTypeNS, s_schemaNamespaceString))
{
parsingComplexType.IsStruct = false;
return;
}
}
else
{
// Anonymous type case
attrTypeNS = parsingNamespace.Namespace;
attrTypeName = parsingNamespace.GetNextAnonymousName();
bPrimitive = false;
bEmbedded = true;
int curDepth = _XMLReader.Depth;
ReadNextXmlElement();
// Parse the type
String elementName;
while(_XMLReader.Depth > curDepth)
{
elementName = _XMLReader.LocalName;
if(MatchingStrings(elementName, s_simpleTypeString))
{
URTSimpleType simpleType = ParseSimpleType(parsingNamespace, attrTypeName);
if(simpleType.IsEmittableFieldType)
{
attrTypeNS = simpleType.FieldNamespace;
attrTypeName = simpleType.FieldName;
bPrimitive = simpleType.PrimitiveField;
parsingNamespace.RemoveSimpleType(simpleType);
}
}
else
{
// Ignore others elements such as annotations
SkipXmlElement();
}
}
}
// Add field to the type being parsed
parsingComplexType.AddField(new URTField(attrName, attrTypeName, attrTypeNS,
this, bPrimitive, bEmbedded, true,
bOptional, false, null));
return;
}