XmlAttributes.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. //
  2. // XmlAttributes.cs:
  3. //
  4. // Author:
  5. // John Donagher ([email protected])
  6. //
  7. // (C) 2002 John Donagher
  8. //
  9. using System.Reflection;
  10. using System;
  11. using System.ComponentModel;
  12. using System.Collections;
  13. namespace System.Xml.Serialization
  14. {
  15. /// <summary>
  16. /// Summary description for XmlAttributes.
  17. /// </summary>
  18. public class XmlAttributes
  19. {
  20. private XmlAnyAttributeAttribute xmlAnyAttribute;
  21. private XmlAnyElementAttributes xmlAnyElements;
  22. private XmlArrayAttribute xmlArray;
  23. private XmlArrayItemAttributes xmlArrayItems;
  24. private XmlAttributeAttribute xmlAttribute;
  25. private XmlChoiceIdentifierAttribute xmlChoiceIdentifier;
  26. private object xmlDefaultValue;
  27. private XmlElementAttributes xmlElements;
  28. private XmlEnumAttribute xmlEnum;
  29. private bool xmlIgnore;
  30. private bool xmlns;
  31. private XmlRootAttribute xmlRoot;
  32. private XmlTextAttribute xmlText;
  33. private XmlTypeAttribute xmlType;
  34. private MemberInfo minfo;
  35. private FieldInfo finfo;
  36. private PropertyInfo pinfo;
  37. internal ArrayList XmlIncludes;
  38. //internal string ElementName;
  39. //The element Order in serialization.
  40. internal int order;
  41. internal bool isAttribute;
  42. internal static XmlAttributes.XmlAttributesComparer attrComparer;
  43. //Sorting Order of Elements: XmlNs, XmlAttributes, XmlElement
  44. internal class XmlAttributesComparer : IComparer
  45. {
  46. public int Compare(object x,object y)
  47. {
  48. if(x is XmlAttributes && y is XmlAttributes)
  49. {
  50. XmlAttributes attx = (XmlAttributes)x;
  51. XmlAttributes atty = (XmlAttributes)y;
  52. if(attx.xmlns)
  53. return -1;
  54. if(atty.xmlns)
  55. return 1;
  56. if(attx.isAttribute)
  57. return -1;
  58. if(atty.isAttribute)
  59. return 1;
  60. int diff = attx.order - atty.order;
  61. if(diff == 0)
  62. return 0;
  63. if(diff > 0)
  64. return 1;
  65. if(diff < 0)
  66. return -1;
  67. }
  68. if(x == null)
  69. return -1;
  70. if(y == null)
  71. return 1;
  72. throw new Exception("Should never occur. XmlAttributesComparer.Compare");
  73. }
  74. }
  75. public XmlAttributes ()
  76. {
  77. xmlAnyElements = new XmlAnyElementAttributes ();
  78. xmlArrayItems = new XmlArrayItemAttributes ();
  79. xmlElements = new XmlElementAttributes ();
  80. XmlIncludes = new ArrayList();
  81. }
  82. static XmlAttributes ()
  83. {
  84. attrComparer = new XmlAttributes.XmlAttributesComparer();
  85. }
  86. public XmlAttributes (ICustomAttributeProvider provider)
  87. {
  88. object[] attributes = provider.GetCustomAttributes(false);
  89. foreach(object obj in attributes)
  90. {
  91. if(obj is XmlAnyAttributeAttribute)
  92. xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
  93. else if(obj is XmlAnyElementAttribute)
  94. xmlAnyElements.Add((XmlAnyElementAttribute) obj);
  95. else if(obj is XmlArrayAttribute)
  96. xmlArray = (XmlArrayAttribute) obj;
  97. else if(obj is XmlArrayItemAttribute)
  98. xmlArrayItems.Add((XmlArrayItemAttribute) obj);
  99. else if(obj is XmlAttributeAttribute)
  100. xmlAttribute = (XmlAttributeAttribute) obj;
  101. else if(obj is XmlChoiceIdentifierAttribute)
  102. xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
  103. else if(obj is DefaultValueAttribute)
  104. xmlDefaultValue = obj;
  105. else if(obj is XmlElementAttribute )
  106. xmlElements.Add((XmlElementAttribute ) obj);
  107. else if(obj is XmlEnumAttribute)
  108. xmlEnum = (XmlEnumAttribute) obj;
  109. else if(obj is XmlIgnoreAttribute)
  110. xmlIgnore = true;
  111. else if(obj is XmlNamespaceDeclarationsAttribute)
  112. xmlns = true;
  113. else if(obj is XmlRootAttribute)
  114. xmlRoot = (XmlRootAttribute) obj;
  115. else if(obj is XmlTextAttribute)
  116. xmlText = (XmlTextAttribute) obj;
  117. else if(obj is XmlTypeAttribute)
  118. xmlType = (XmlTypeAttribute) obj;
  119. }
  120. }
  121. #region public properties
  122. public XmlAnyAttributeAttribute XmlAnyAttribute
  123. {
  124. get
  125. {
  126. return xmlAnyAttribute;
  127. }
  128. set
  129. {
  130. xmlAnyAttribute = value;
  131. }
  132. }
  133. public XmlAnyElementAttributes XmlAnyElements
  134. {
  135. get
  136. {
  137. return xmlAnyElements;
  138. }
  139. }
  140. public XmlArrayAttribute XmlArray
  141. {
  142. get
  143. {
  144. return xmlArray;
  145. }
  146. set
  147. {
  148. xmlArray = value;
  149. }
  150. }
  151. public XmlArrayItemAttributes XmlArrayItems
  152. {
  153. get
  154. {
  155. return xmlArrayItems;
  156. }
  157. }
  158. public XmlAttributeAttribute XmlAttribute
  159. {
  160. get
  161. {
  162. return xmlAttribute;
  163. }
  164. set
  165. {
  166. xmlAttribute = value;
  167. }
  168. }
  169. public XmlChoiceIdentifierAttribute XmlChoiceIdentifier
  170. {
  171. get
  172. {
  173. return xmlChoiceIdentifier;
  174. }
  175. set
  176. {
  177. xmlChoiceIdentifier = value;
  178. }
  179. }
  180. public object XmlDefaultValue
  181. {
  182. get
  183. {
  184. return xmlDefaultValue;
  185. }
  186. set
  187. {
  188. xmlDefaultValue = value;
  189. }
  190. }
  191. public XmlElementAttributes XmlElements
  192. {
  193. get
  194. {
  195. return xmlElements;
  196. }
  197. }
  198. public XmlEnumAttribute XmlEnum
  199. {
  200. get
  201. {
  202. return xmlEnum;
  203. }
  204. set
  205. {
  206. xmlEnum = value;
  207. }
  208. }
  209. public bool XmlIgnore
  210. {
  211. get
  212. {
  213. return xmlIgnore;
  214. }
  215. set
  216. {
  217. xmlIgnore = value;
  218. }
  219. }
  220. public bool Xmlns
  221. {
  222. get
  223. {
  224. return xmlns;
  225. }
  226. set
  227. {
  228. xmlns = value;
  229. }
  230. }
  231. public XmlRootAttribute XmlRoot
  232. {
  233. get
  234. {
  235. return xmlRoot;}
  236. set
  237. {
  238. xmlRoot = value;
  239. }
  240. }
  241. public XmlTextAttribute XmlText
  242. {
  243. get
  244. {
  245. return xmlText;
  246. }
  247. set
  248. {
  249. xmlText = value;
  250. }
  251. }
  252. public XmlTypeAttribute XmlType
  253. {
  254. get
  255. {
  256. return xmlType;
  257. }
  258. set
  259. {
  260. xmlType = value;
  261. }
  262. }
  263. #endregion
  264. #region internal properties
  265. internal MemberInfo MemberInfo
  266. {
  267. get { return minfo; }
  268. set { minfo = value; }
  269. }
  270. internal FieldInfo FieldInfo
  271. {
  272. get { return finfo; }
  273. set { finfo = value; }
  274. }
  275. internal PropertyInfo PropertyInfo
  276. {
  277. get { return pinfo; }
  278. set { pinfo = value; }
  279. }
  280. #endregion
  281. //Only permissible attributes for a class type are: XmlRoot and XmlInclude
  282. internal static XmlAttributes FromClass(Type classType)
  283. {
  284. XmlAttributes XmlAttr = new XmlAttributes();
  285. object[] attributes = classType.GetCustomAttributes(false);
  286. foreach(object obj in attributes)
  287. {
  288. if(obj is XmlRootAttribute)
  289. XmlAttr.xmlRoot = (XmlRootAttribute) obj;
  290. else if(obj is XmlIncludeAttribute)
  291. XmlAttr.XmlIncludes.Add(obj);
  292. }
  293. return XmlAttr;
  294. }
  295. internal static XmlAttributes FromField(MemberInfo member, FieldInfo finfo)
  296. {
  297. XmlAttributes XmlAttr = new XmlAttributes();
  298. object[] attributes = member.GetCustomAttributes(false);
  299. XmlAttr.AddMemberAttributes(attributes);
  300. XmlAttr.minfo = member;
  301. XmlAttr.finfo = finfo;
  302. return XmlAttr;
  303. }
  304. internal static XmlAttributes FromProperty(MemberInfo member, PropertyInfo pinfo)
  305. {
  306. XmlAttributes XmlAttr = new XmlAttributes();
  307. object[] attributes = member.GetCustomAttributes(false);
  308. XmlAttr.AddMemberAttributes(attributes);
  309. XmlAttr.minfo = member;
  310. XmlAttr.pinfo = pinfo;
  311. return XmlAttr;
  312. }
  313. internal void AddMemberAttributes(object[] attributes)
  314. {
  315. foreach(object obj in attributes)
  316. {
  317. if(obj is XmlAnyAttributeAttribute)
  318. {
  319. xmlAnyAttribute = (XmlAnyAttributeAttribute) obj;
  320. isAttribute = true;
  321. }
  322. else if(obj is XmlAttributeAttribute)
  323. {
  324. xmlAttribute = (XmlAttributeAttribute) obj;
  325. isAttribute = true;
  326. }
  327. else if(obj is XmlNamespaceDeclarationsAttribute)
  328. {
  329. xmlns = true;
  330. isAttribute = true;
  331. }
  332. else if(obj is XmlAnyElementAttribute)
  333. {
  334. xmlAnyElements.Add((XmlAnyElementAttribute) obj);
  335. order = ((XmlAnyElementAttribute) obj).Order;
  336. }
  337. else if(obj is XmlArrayAttribute)
  338. {
  339. xmlArray = (XmlArrayAttribute) obj;
  340. order = ((XmlArrayAttribute) obj).Order;
  341. }
  342. else if(obj is XmlArrayItemAttribute)
  343. {
  344. xmlArrayItems.Add((XmlArrayItemAttribute) obj);
  345. order = ((XmlArrayItemAttribute) obj).Order;
  346. }
  347. else if(obj is XmlChoiceIdentifierAttribute)
  348. {
  349. xmlChoiceIdentifier = (XmlChoiceIdentifierAttribute) obj;
  350. order = ((XmlChoiceIdentifierAttribute) obj).Order;
  351. }
  352. else if(obj is XmlTextAttribute)
  353. {
  354. xmlText = (XmlTextAttribute) obj;
  355. order = ((XmlTextAttribute) obj).Order;
  356. }
  357. else if(obj is XmlElementAttribute )
  358. {
  359. xmlElements.Add((XmlElementAttribute ) obj);
  360. order = ((XmlElementAttribute ) obj).Order;
  361. }
  362. else if(obj is DefaultValueAttribute)
  363. {
  364. xmlDefaultValue = ((DefaultValueAttribute ) obj).Value;
  365. }
  366. else if(obj is XmlEnumAttribute)
  367. {
  368. xmlEnum = (XmlEnumAttribute) obj;
  369. }
  370. else if(obj is XmlIgnoreAttribute)
  371. {
  372. xmlIgnore = true;
  373. }
  374. else if(obj is XmlRootAttribute)
  375. {
  376. throw new Exception("should never happen. XmlRoot on a member");
  377. }
  378. else if(obj is XmlTypeAttribute)
  379. {
  380. xmlType = (XmlTypeAttribute) obj;
  381. }
  382. }
  383. }
  384. internal string GetAttributeName(Type type, string defaultName)
  385. {
  386. if(XmlAttribute != null && XmlAttribute.AttributeName != null && XmlAttribute.AttributeName != "")
  387. return XmlAttribute.AttributeName;
  388. return defaultName;
  389. }
  390. internal string GetElementName(Type type, string defaultName)
  391. {
  392. foreach(XmlElementAttribute elem in XmlElements)
  393. {
  394. if(elem.Type == type && elem.ElementName != null && elem.ElementName != "")
  395. return elem.ElementName;
  396. else if(elem.Type == null && elem.ElementName != null && elem.ElementName != "")
  397. return elem.ElementName;
  398. }
  399. return defaultName;
  400. }
  401. internal string GetAttributeNamespace(Type type)
  402. {
  403. if(XmlAttribute != null)
  404. return XmlAttribute.Namespace;
  405. return null;
  406. }
  407. internal string GetElementNamespace(Type type)
  408. {
  409. foreach(XmlElementAttribute elem in XmlElements)
  410. {
  411. if(elem.Type == type )
  412. return elem.Namespace;
  413. else if(elem.Type == null)
  414. return elem.Namespace;
  415. }
  416. return null;
  417. }
  418. }
  419. }