XmlSchemaKey.cs 3.1 KB

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