Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / WebForms / System / Web / UI / Design / XmlDocumentSchema.cs / 1 / XmlDocumentSchema.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Web.UI.Design {
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Xml;
using System.Xml.XPath;
///
/// A class to expose hierarchical schema from an XmlDocument object.
/// This is used by data source designers to enable data-bound to
/// traverse their schema at design time.
///
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, Flags=System.Security.Permissions.SecurityPermissionFlag.UnmanagedCode)]
public sealed class XmlDocumentSchema : IDataSourceSchema {
private OrderedDictionary _rootSchema;
private IDataSourceViewSchema[] _viewSchemas;
private bool _includeSpecialSchema;
public XmlDocumentSchema(XmlDocument xmlDocument, string xPath) : this(xmlDocument, xPath, false) {
}
internal XmlDocumentSchema(XmlDocument xmlDocument, string xPath, bool includeSpecialSchema) {
if (xmlDocument == null) {
throw new ArgumentNullException("xmlDocument");
}
_includeSpecialSchema = includeSpecialSchema;
_rootSchema = new OrderedDictionary();
// Get a list of all element nodes in document order and add them
// to the schema hierarchy
XPathNavigator nav = xmlDocument.CreateNavigator();
if (!String.IsNullOrEmpty(xPath)) {
// If there is an XPath, go through each XPath result and add its descendants
XPathNodeIterator xPathIterator = nav.Select(xPath);
while (xPathIterator.MoveNext()) {
XPathNodeIterator childIterator = xPathIterator.Current.SelectDescendants(XPathNodeType.Element, true);
while (childIterator.MoveNext()) {
Debug.Assert(childIterator.Current.NodeType == XPathNodeType.Element);
AddSchemaElement(childIterator.Current, xPathIterator.Current);
}
}
}
else {
// If there is no XPath, just go through the root's descendants
XPathNodeIterator childIterator = nav.SelectDescendants(XPathNodeType.Element, true);
while (childIterator.MoveNext()) {
Debug.Assert(childIterator.Current.NodeType == XPathNodeType.Element);
AddSchemaElement(childIterator.Current, nav);
}
}
}
private void AddSchemaElement(XPathNavigator nav, XPathNavigator rootNav) {
// Get list of all ancestors in reverse document order in order
// to get a hierarchical path to this element
System.Collections.Generic.List path = new System.Collections.Generic.List();
XPathNodeIterator parentIterator = nav.SelectAncestors(XPathNodeType.Element, true);
while (parentIterator.MoveNext()) {
Debug.Assert(parentIterator.Current.NodeType == XPathNodeType.Element);
path.Add(parentIterator.Current.Name);
if (parentIterator.Current.IsSamePosition(rootNav)) {
// Stop if we get to the root of this sub-tree
break;
}
}
path.Reverse();
Debug.Assert(path.Count > 0, "Expected path to contain at least one entry (the node itself!)");
// Find the location in the schema where the attributes of this element belong
OrderedDictionary schemaLevel = _rootSchema;
Pair nodeEntry = null;
foreach (string pathPart in path) {
nodeEntry = schemaLevel[pathPart] as Pair;
if (nodeEntry == null) {
// Demand-create an entry for this type of node if it is not found
nodeEntry = new Pair(new OrderedDictionary() /* list of child node types */, new ArrayList() /* list of attributes */);
// Add this type of child node to the current parent type we are at
schemaLevel.Add(pathPart, nodeEntry);
}
// Advance one level deeper
schemaLevel = (OrderedDictionary)nodeEntry.First;
}
Debug.Assert(nodeEntry != null, "Did not expect null schema entry - it should be auto-created");
// Add the list of attributes to this type of node
AddAttributeList(nav, (ArrayList)nodeEntry.Second);
}
private void AddAttributeList(XPathNavigator nav, ArrayList attrs) {
Debug.Assert(attrs != null);
if (!nav.HasAttributes) {
return;
}
bool success = nav.MoveToFirstAttribute();
Debug.Assert(success);
// Go through all the attributes and add new ones to the list
do {
if (!attrs.Contains(nav.Name)) {
attrs.Add(nav.Name);
}
} while (nav.MoveToNextAttribute());
success = nav.MoveToParent();
Debug.Assert(success);
}
public IDataSourceViewSchema[] GetViews() {
if (_viewSchemas == null) {
_viewSchemas = new IDataSourceViewSchema[_rootSchema.Count];
int i = 0;
foreach (DictionaryEntry de in _rootSchema) {
_viewSchemas[i] = new XmlDocumentViewSchema((string)de.Key, (Pair)de.Value, _includeSpecialSchema);
i++;
}
}
return _viewSchemas;
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SatelliteContractVersionAttribute.cs
- AsymmetricKeyExchangeDeformatter.cs
- ClientApiGenerator.cs
- HMAC.cs
- DefaultClaimSet.cs
- DataColumnMappingCollection.cs
- UnsafeNetInfoNativeMethods.cs
- HTTPRemotingHandler.cs
- UrlParameterReader.cs
- DataRelation.cs
- TextRangeEditTables.cs
- EmptyEnumerator.cs
- elementinformation.cs
- TcpPortSharing.cs
- XmlChildNodes.cs
- XmlSchemaImport.cs
- FtpRequestCacheValidator.cs
- TreeNodeCollection.cs
- DataGridViewCellStateChangedEventArgs.cs
- QilName.cs
- ArcSegment.cs
- ThicknessKeyFrameCollection.cs
- StyleCollectionEditor.cs
- DbModificationCommandTree.cs
- RecognizedAudio.cs
- StringComparer.cs
- MLangCodePageEncoding.cs
- Thickness.cs
- GifBitmapDecoder.cs
- IDQuery.cs
- FrugalList.cs
- ApplicationDirectory.cs
- DataSourceConverter.cs
- MsmqOutputSessionChannel.cs
- FactoryMaker.cs
- DescendantOverDescendantQuery.cs
- _SslState.cs
- TagPrefixAttribute.cs
- CompositeDataBoundControl.cs
- ResourcePool.cs
- WinEventTracker.cs
- ControlDesignerState.cs
- StreamInfo.cs
- SchemaImporterExtensionElementCollection.cs
- TextServicesContext.cs
- PreviewPageInfo.cs
- TextRangeProviderWrapper.cs
- UdpChannelFactory.cs
- DataGridViewLayoutData.cs
- SmtpClient.cs
- MarkupExtensionReturnTypeAttribute.cs
- KnownAssembliesSet.cs
- SHA1Cng.cs
- MultilineStringEditor.cs
- DataGridColumn.cs
- MsmqBindingElementBase.cs
- Misc.cs
- CollectionDataContract.cs
- SoapFault.cs
- ContextProperty.cs
- URLMembershipCondition.cs
- DefaultClaimSet.cs
- SmtpFailedRecipientException.cs
- PropertyDescriptorGridEntry.cs
- CultureSpecificCharacterBufferRange.cs
- Preprocessor.cs
- SafeTimerHandle.cs
- IdentityHolder.cs
- ReachUIElementCollectionSerializerAsync.cs
- WebColorConverter.cs
- Page.cs
- ColumnMapProcessor.cs
- PeerCredentialElement.cs
- ReadWriteSpinLock.cs
- InlineUIContainer.cs
- XamlToRtfWriter.cs
- xmlglyphRunInfo.cs
- Ref.cs
- PopupEventArgs.cs
- DeclarativeExpressionConditionDeclaration.cs
- SafeCertificateContext.cs
- HitTestWithGeometryDrawingContextWalker.cs
- ResourcePermissionBase.cs
- Mapping.cs
- ManualResetEvent.cs
- HtmlInputButton.cs
- DataGridViewCell.cs
- Psha1DerivedKeyGenerator.cs
- CredentialCache.cs
- Certificate.cs
- SafeNativeMethods.cs
- Exceptions.cs
- EntityModelBuildProvider.cs
- RequiredAttributeAttribute.cs
- RijndaelManaged.cs
- FileClassifier.cs
- TitleStyle.cs
- RowTypePropertyElement.cs
- SemanticResultValue.cs
- SerializationInfo.cs