XmlCodeExporter.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  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 if (!member.Any)
  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. CodeAttributeDeclaration ratt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlRoot");
  94. if (map.ElementName != map.XmlType) ratt.Arguments.Add (GetArg (map.ElementName));
  95. if (map.Namespace != "") ratt.Arguments.Add (GetArg ("Namespace", map.Namespace));
  96. AddCustomAttribute (codeClass, ratt, false);
  97. }
  98. protected override void GenerateClassInclude (CodeTypeDeclaration codeClass, XmlTypeMapping map)
  99. {
  100. CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlInclude");
  101. iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));
  102. AddCustomAttribute (codeClass, iatt, true);
  103. }
  104. protected override void GenerateAnyAttribute (CodeMemberField codeField)
  105. {
  106. AddCustomAttribute (codeField, "System.Xml.Serialization.XmlAnyAttribute");
  107. }
  108. protected override void GenerateDefaultAttribute (CodeMemberField codeField, object defaultValue)
  109. {
  110. AddCustomAttribute (codeField, "System.ComponentModel.DefaultValue", GetArg (defaultValue));
  111. codeField.InitExpression = new CodePrimitiveExpression (defaultValue);
  112. }
  113. protected override void GenerateAttributeMember (CodeMemberField codeField, XmlTypeMapMemberAttribute attinfo, string defaultNamespace)
  114. {
  115. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlAttribute");
  116. if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));
  117. if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));
  118. if (attinfo.Form != XmlSchemaForm.None) att.Arguments.Add (GetArg ("Form",attinfo.Form));
  119. if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));
  120. AddCustomAttribute (codeField, att, true);
  121. }
  122. protected override void GenerateElementInfoMember (CodeMemberField codeField, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr)
  123. {
  124. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlElement");
  125. if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));
  126. if (einfo.TypeData.FullTypeName != defaultType.FullTypeName) att.Arguments.Add (GetTypeArg ("Type", einfo.TypeData.FullTypeName));
  127. if (einfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", einfo.Namespace));
  128. if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));
  129. if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));
  130. AddCustomAttribute (codeField, att, addAlwaysAttr);
  131. }
  132. protected override void GenerateElementMember (CodeMemberField codeField, XmlTypeMapMemberElement member)
  133. {
  134. if (member.ChoiceMember != null)
  135. AddCustomAttribute (codeField, "System.Xml.Serialization.XmlChoiceIdentifier", GetArg(member.ChoiceMember));
  136. }
  137. protected override void GenerateArrayElement (CodeMemberField codeField, XmlTypeMapMemberElement member, string defaultNamespace)
  138. {
  139. XmlTypeMapElementInfo einfo = (XmlTypeMapElementInfo) member.ElementInfo[0];
  140. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArray");
  141. if (einfo.ElementName != member.Name) att.Arguments.Add (GetArg ("ElementName", einfo.ElementName));
  142. if (einfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", einfo.Namespace));
  143. if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));
  144. AddCustomAttribute (codeField, att, false);
  145. }
  146. protected override void GenerateArrayItemAttributes (CodeMemberField codeField, ListMap listMap, TypeData type, XmlTypeMapElementInfo ainfo, string defaultName, string defaultNamespace, int nestingLevel)
  147. {
  148. bool needsType = (listMap.ItemInfo.Count > 1) ||
  149. (ainfo.TypeData.FullTypeName != type.FullTypeName && !listMap.IsMultiArray);
  150. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlArrayItem");
  151. if (ainfo.ElementName != defaultName) att.Arguments.Add (GetArg ("ElementName", ainfo.ElementName));
  152. if (ainfo.Namespace != defaultNamespace && ainfo.Namespace != XmlSchema.Namespace) att.Arguments.Add (GetArg ("Namespace", ainfo.Namespace));
  153. if (needsType) att.Arguments.Add (GetTypeArg ("Type", ainfo.TypeData.FullTypeName));
  154. if (ainfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));
  155. if (att.Arguments.Count > 0 && nestingLevel > 0) att.Arguments.Add (GetArg ("NestingLevel", nestingLevel));
  156. AddCustomAttribute (codeField, att, false);
  157. }
  158. protected override void GenerateTextElementAttribute (CodeMemberField codeField, XmlTypeMapElementInfo einfo, TypeData defaultType)
  159. {
  160. CodeAttributeDeclaration uatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlText");
  161. if (einfo.TypeData.FullTypeName != defaultType.FullTypeName) uatt.Arguments.Add (GetTypeArg ("Type", einfo.TypeData.FullTypeName));
  162. AddCustomAttribute (codeField, uatt, true);
  163. }
  164. protected override void GenerateUnnamedAnyElementAttribute (CodeMemberField codeField, XmlTypeMapElementInfo einfo, string defaultNamespace)
  165. {
  166. CodeAttributeDeclaration uatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlAnyElement");
  167. if (!einfo.IsUnnamedAnyElement) uatt.Arguments.Add (GetArg ("Name", einfo.ElementName));
  168. if (einfo.Namespace != defaultNamespace) uatt.Arguments.Add (GetArg ("Namespace", einfo.Namespace));
  169. AddCustomAttribute (codeField, uatt, true);
  170. }
  171. protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)
  172. {
  173. CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlTypeAttribute");
  174. if (map.ElementName != map.TypeData.TypeName) att.Arguments.Add (GetArg ("TypeName", map.ElementName));
  175. if (map.Namespace != "") att.Arguments.Add (GetArg ("Namespace", map.Namespace));
  176. AddCustomAttribute (codeEnum, att, false);
  177. }
  178. protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)
  179. {
  180. if (emem.EnumName != emem.XmlName)
  181. {
  182. CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.XmlEnum");
  183. xatt.Arguments.Add (GetArg ("Name", emem.XmlName));
  184. AddCustomAttribute (codeField, xatt, true);
  185. }
  186. }
  187. protected override void GenerateSpecifierMember (CodeMemberField codeField)
  188. {
  189. AddCustomAttribute (codeField, "System.Xml.Serialization.XmlIgnore");
  190. }
  191. }
  192. }