XmlCodeExporter.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. //
  2. // System.Xml.Serialization.XmlCodeExporter
  3. //
  4. // Author:
  5. // Tim Coleman ([email protected])
  6. // Lluis Sanchez Gual ([email protected])
  7. //
  8. // Copyright (C) Tim Coleman, 2002
  9. //
  10. using System.CodeDom;
  11. using System.Collections;
  12. using System.Xml.Schema;
  13. namespace System.Xml.Serialization {
  14. public class XmlCodeExporter {
  15. #region Fields
  16. CodeNamespace codeNamespace;
  17. CodeCompileUnit codeCompileUnit;
  18. CodeAttributeDeclarationCollection includeMetadata;
  19. bool encodedFormat;
  20. XmlMapCodeGenerator codeGenerator;
  21. Hashtable exportedMaps = new Hashtable ();
  22. #endregion
  23. #region Constructors
  24. public XmlCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)
  25. {
  26. }
  27. public XmlCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)
  28. {
  29. includeMetadata = new CodeAttributeDeclarationCollection ();
  30. this.codeCompileUnit = codeCompileUnit;
  31. this.codeNamespace = codeNamespace;
  32. codeGenerator = new XmlMapCodeGenerator (codeNamespace, codeCompileUnit);
  33. }
  34. #endregion // Constructors
  35. #region Properties
  36. public CodeAttributeDeclarationCollection IncludeMetadata {
  37. get { return includeMetadata; }
  38. }
  39. #endregion Properties
  40. #region Methods
  41. public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, string ns)
  42. {
  43. AddMappingMetadata (metadata, member, ns, false);
  44. }
  45. [MonoTODO]
  46. public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlTypeMapping member, string ns)
  47. {
  48. throw new NotImplementedException ();
  49. }
  50. public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, string ns, bool forceUseMemberName)
  51. {
  52. CodeAttributeDeclaration att;
  53. TypeData memType = member.TypeMapMember.TypeData;
  54. if (memType.SchemaType == SchemaTypes.Array)
  55. {
  56. // Array parameter
  57. att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArray");
  58. if (forceUseMemberName || (member.ElementName != member.MemberName)) att.Arguments.Add (MapCodeGenerator.GetArg ("ElementName", member.ElementName));
  59. if (member.Namespace != ns) att.Arguments.Add (MapCodeGenerator.GetArg ("Namespace", member.Namespace));
  60. if (att.Arguments.Count > 0) metadata.Add (att);
  61. }
  62. else
  63. {
  64. att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlElement");
  65. if (forceUseMemberName || (member.ElementName != member.MemberName)) att.Arguments.Add (MapCodeGenerator.GetArg ("ElementName", member.ElementName));
  66. if (member.Namespace != ns) att.Arguments.Add (MapCodeGenerator.GetArg ("Namespace", member.Namespace));
  67. if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType)) att.Arguments.Add (MapCodeGenerator.GetArg ("DataType", member.TypeName));
  68. if (att.Arguments.Count > 0) metadata.Add (att);
  69. }
  70. }
  71. public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)
  72. {
  73. codeGenerator.ExportMembersMapping (xmlMembersMapping);
  74. }
  75. public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)
  76. {
  77. codeGenerator.ExportTypeMapping (xmlTypeMapping);
  78. }
  79. #endregion // Methods
  80. }
  81. class XmlMapCodeGenerator : MapCodeGenerator
  82. {
  83. public XmlMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)
  84. : base (codeNamespace, codeCompileUnit)
  85. {
  86. }
  87. protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass)
  88. {
  89. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlType");
  90. if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));
  91. if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));
  92. AddCustomAttribute (codeClass, att, false);
  93. if (map.ElementName != map.XmlType || map.Namespace != map.XmlTypeNamespace) {
  94. CodeAttributeDeclaration ratt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlRoot");
  95. ratt.Arguments.Add (GetArg (map.ElementName));
  96. ratt.Arguments.Add (GetArg ("Namespace", map.Namespace));
  97. AddCustomAttribute (codeClass, ratt, false);
  98. }
  99. }
  100. protected override void GenerateClassInclude (CodeTypeDeclaration codeClass, XmlTypeMapping map)
  101. {
  102. CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlInclude");
  103. iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));
  104. AddCustomAttribute (codeClass, iatt, true);
  105. }
  106. protected override void GenerateAnyAttribute (CodeMemberField codeField)
  107. {
  108. AddCustomAttribute (codeField, "System.Xml.Serialization.XmlAnyAttribute");
  109. }
  110. protected override void GenerateDefaultAttribute (CodeMemberField codeField, object defaultValue)
  111. {
  112. AddCustomAttribute (codeField, "System.ComponentModel.DefaultValue", GetArg (defaultValue));
  113. codeField.InitExpression = new CodePrimitiveExpression (defaultValue);
  114. }
  115. protected override void GenerateAttributeMember (CodeMemberField codeField, XmlTypeMapMemberAttribute attinfo, string defaultNamespace)
  116. {
  117. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlAttribute");
  118. if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));
  119. if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));
  120. if (attinfo.Form != XmlSchemaForm.None) att.Arguments.Add (GetArg ("Form",attinfo.Form));
  121. if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));
  122. AddCustomAttribute (codeField, att, true);
  123. }
  124. protected override void GenerateElementInfoMember (CodeMemberField codeField, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr)
  125. {
  126. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlElement");
  127. if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));
  128. if (einfo.TypeData.FullTypeName != defaultType.FullTypeName) att.Arguments.Add (GetTypeArg ("Type", einfo.TypeData.FullTypeName));
  129. if (einfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", einfo.Namespace));
  130. if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));
  131. if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));
  132. AddCustomAttribute (codeField, att, addAlwaysAttr);
  133. }
  134. protected override void GenerateElementMember (CodeMemberField codeField, XmlTypeMapMemberElement member)
  135. {
  136. if (member.ChoiceMember != null)
  137. AddCustomAttribute (codeField, "System.Xml.Serialization.XmlChoiceIdentifier", GetArg(member.ChoiceMember));
  138. }
  139. protected override void GenerateArrayElement (CodeMemberField codeField, XmlTypeMapMemberElement member, string defaultNamespace)
  140. {
  141. XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) member.ElementInfo[0];
  142. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArray");
  143. if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg ("ElementName", einfo.ElementName));
  144. if (einfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", einfo.Namespace));
  145. if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));
  146. AddCustomAttribute (codeField, att, false);
  147. }
  148. protected override void GenerateArrayItemAttributes (CodeMemberField codeField, ListMap listMap, TypeData type, XmlTypeMapElementInfo ainfo, string defaultName, string defaultNamespace, int nestingLevel)
  149. {
  150. bool needsType = (listMap.ItemInfo.Count > 1) ||
  151. (ainfo.TypeData.FullTypeName != type.FullTypeName && !listMap.IsMultiArray);
  152. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArrayItem");
  153. if (ainfo.ElementName != defaultName) att.Arguments.Add (GetArg ("ElementName", ainfo.ElementName));
  154. if (ainfo.Namespace != defaultNamespace && ainfo.Namespace != XmlSchema.Namespace) att.Arguments.Add (GetArg ("Namespace", ainfo.Namespace));
  155. if (needsType) att.Arguments.Add (GetTypeArg ("Type", ainfo.TypeData.FullTypeName));
  156. if (ainfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));
  157. if (att.Arguments.Count > 0 && nestingLevel > 0) att.Arguments.Add (GetArg ("NestingLevel", nestingLevel));
  158. AddCustomAttribute (codeField, att, false);
  159. }
  160. protected override void GenerateTextElementAttribute (CodeMemberField codeField, XmlTypeMapElementInfo einfo, TypeData defaultType)
  161. {
  162. CodeAttributeDeclaration uatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlText");
  163. if (einfo.TypeData.FullTypeName != defaultType.FullTypeName) uatt.Arguments.Add (GetTypeArg ("Type", einfo.TypeData.FullTypeName));
  164. AddCustomAttribute (codeField, uatt, true);
  165. }
  166. protected override void GenerateUnnamedAnyElementAttribute (CodeMemberField codeField, XmlTypeMapElementInfo einfo, string defaultNamespace)
  167. {
  168. CodeAttributeDeclaration uatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlAnyElement");
  169. if (!einfo.IsUnnamedAnyElement) uatt.Arguments.Add (GetArg ("Name", einfo.ElementName));
  170. if (einfo.Namespace != defaultNamespace) uatt.Arguments.Add (GetArg ("Namespace", einfo.Namespace));
  171. AddCustomAttribute (codeField, uatt, true);
  172. }
  173. protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)
  174. {
  175. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlTypeAttribute");
  176. if (map.ElementName != map.TypeData.TypeName) att.Arguments.Add (GetArg ("Name", map.ElementName));
  177. if (map.Namespace != "") att.Arguments.Add (GetArg ("Namespace", map.Namespace));
  178. AddCustomAttribute (codeEnum, att, false);
  179. }
  180. protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)
  181. {
  182. if (emem.EnumName != emem.XmlName)
  183. {
  184. CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlEnum");
  185. xatt.Arguments.Add (GetArg ("Name", emem.XmlName));
  186. AddCustomAttribute (codeField, xatt, true);
  187. }
  188. }
  189. }
  190. }