XmlSchemaKey.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Author: Dwivedi, Ajay kumar
  2. // [email protected]
  3. using System;
  4. using System.Xml;
  5. namespace System.Xml.Schema
  6. {
  7. /// <summary>
  8. /// Summary description for XmlSchemaKey.
  9. /// </summary>
  10. public class XmlSchemaKey : XmlSchemaIdentityConstraint
  11. {
  12. private static string xmlname = "key";
  13. public XmlSchemaKey()
  14. {
  15. }
  16. /// <remarks>
  17. /// 1. name must be present
  18. /// 2. selector and field must be present
  19. /// </remarks>
  20. [MonoTODO]
  21. internal override int Compile(ValidationEventHandler h, XmlSchema schema)
  22. {
  23. return base.Compile(h, schema);
  24. }
  25. /*
  26. internal new void error(ValidationEventHandler handle, string message)
  27. {
  28. errorCount++;
  29. ValidationHandler.RaiseValidationError(handle, this, message);
  30. }
  31. */
  32. //<key
  33. // id = ID
  34. // name = NCName
  35. // {any attributes with non-schema namespace . . .}>
  36. // Content: (annotation?, (selector, field+))
  37. //</key>
  38. internal static XmlSchemaKey Read(XmlSchemaReader reader, ValidationEventHandler h)
  39. {
  40. XmlSchemaKey key = new XmlSchemaKey();
  41. reader.MoveToElement();
  42. if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)
  43. {
  44. error(h,"Should not happen :1: XmlSchemaKey.Read, name="+reader.Name,null);
  45. reader.Skip();
  46. return null;
  47. }
  48. key.LineNumber = reader.LineNumber;
  49. key.LinePosition = reader.LinePosition;
  50. key.SourceUri = reader.BaseURI;
  51. while(reader.MoveToNextAttribute())
  52. {
  53. if(reader.Name == "id")
  54. {
  55. key.Id = reader.Value;
  56. }
  57. else if(reader.Name == "name")
  58. {
  59. key.Name = reader.Value;
  60. }
  61. else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
  62. {
  63. error(h,reader.Name + " is not a valid attribute for key",null);
  64. }
  65. else
  66. {
  67. XmlSchemaUtil.ReadUnhandledAttribute(reader,key);
  68. }
  69. }
  70. reader.MoveToElement();
  71. if(reader.IsEmptyElement)
  72. return key;
  73. // Content: annotation?, selector, field+
  74. int level = 1;
  75. while(reader.ReadNextElement())
  76. {
  77. if(reader.NodeType == XmlNodeType.EndElement)
  78. {
  79. if(reader.LocalName != xmlname)
  80. error(h,"Should not happen :2: XmlSchemaKey.Read, name="+reader.Name,null);
  81. break;
  82. }
  83. if(level <= 1 && reader.LocalName == "annotation")
  84. {
  85. level = 2; //Only one annotation
  86. XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
  87. if(annotation != null)
  88. key.Annotation = annotation;
  89. continue;
  90. }
  91. if(level <= 2 && reader.LocalName == "selector")
  92. {
  93. level = 3;
  94. XmlSchemaXPath selector = XmlSchemaXPath.Read(reader,h,"selector");
  95. if(selector != null)
  96. key.Selector = selector;
  97. continue;
  98. }
  99. if(level <= 3 && reader.LocalName == "field")
  100. {
  101. level = 3;
  102. if(key.Selector == null)
  103. error(h,"selector must be defined before field declarations",null);
  104. XmlSchemaXPath field = XmlSchemaXPath.Read(reader,h,"field");
  105. if(field != null)
  106. key.Fields.Add(field);
  107. continue;
  108. }
  109. reader.RaiseInvalidElementError();
  110. }
  111. return key;
  112. }
  113. }
  114. }