Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Xml / System / Xml / XPath / Internal / precedingquery.cs / 1 / precedingquery.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace MS.Internal.Xml.XPath { using System; using System.Xml; using System.Xml.XPath; using System.Diagnostics; using System.Collections.Generic; using StackNav = ClonableStack; // Algorithm: // Input assumption: qyInput is in DocOrder. // Preceding of a sequence of nodes will be preceding of last node in DocOrder in that sequence. // Because qyInput is in DO last input is last node in DO. -- "last" // If last node is attribute or namespace move last to it element. // Push this last node and all its ancestors into the ancestorStk. The root node will be the top-most element on the stack. // Create descendent iterator from the root. -- "workIterator" // Advancing workIterator we meet all nodes from the ancestorStk in stack order. Nodes in ancestorStk do no belong to the // the 'preceding' axis and must be ignored. // Last node in ancestorStk is a centinel node; when we pop it from ancestorStk, we should stop iterations. internal sealed class PrecedingQuery : BaseAxisQuery { private XPathNodeIterator workIterator; private StackNav ancestorStk; public PrecedingQuery(Query qyInput, string name, string prefix, XPathNodeType typeTest) : base(qyInput, name, prefix, typeTest) { ancestorStk = new StackNav(); } private PrecedingQuery(PrecedingQuery other) : base(other) { this.workIterator = Clone(other.workIterator); this.ancestorStk = other.ancestorStk.Clone(); } public override void Reset() { workIterator = null; ancestorStk.Clear(); base.Reset(); } public override XPathNavigator Advance() { if (workIterator == null) { XPathNavigator last; { XPathNavigator input = qyInput.Advance(); if (input == null) { return null; } last = input.Clone(); do { last.MoveTo(input); } while ((input = qyInput.Advance()) != null); if (last.NodeType == XPathNodeType.Attribute || last.NodeType == XPathNodeType.Namespace) { last.MoveToParent(); } } // Fill ancestorStk : do { ancestorStk.Push(last.Clone()); } while (last.MoveToParent()); // Create workIterator : // last.MoveToRoot(); We are on root already workIterator = last.SelectDescendants(XPathNodeType.All, true); } while (workIterator.MoveNext()) { currentNode = workIterator.Current; if (currentNode.IsSamePosition(ancestorStk.Peek())) { ancestorStk.Pop(); if (ancestorStk.Count == 0) { currentNode = null; workIterator = null; Debug.Assert(qyInput.Advance() == null, "we read all qyInput.Advance() already"); return null; } continue; } if (matches(currentNode)) { position++; return currentNode; } } Debug.Fail("Algorithm error: we missed the centinel node"); return null; } public override XPathNodeIterator Clone() { return new PrecedingQuery(this); } public override QueryProps Properties { get { return base.Properties | QueryProps.Reverse; } } } } // 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
- JsonQNameDataContract.cs
- ConsumerConnectionPointCollection.cs
- GroupByQueryOperator.cs
- DataGridViewCell.cs
- XmlHelper.cs
- DataGridViewTopRowAccessibleObject.cs
- QueryCacheKey.cs
- RegistrySecurity.cs
- RequestQueryParser.cs
- ResXResourceSet.cs
- PackWebResponse.cs
- DockingAttribute.cs
- MulticastOption.cs
- HttpPostedFile.cs
- DataContractSet.cs
- Operator.cs
- Vector3DValueSerializer.cs
- ServiceDocumentFormatter.cs
- FilePrompt.cs
- ProgressiveCrcCalculatingStream.cs
- RequestSecurityTokenSerializer.cs
- Form.cs
- QuaternionRotation3D.cs
- XmlSchemaObjectTable.cs
- HMAC.cs
- DataGridViewColumnTypePicker.cs
- WebPartTransformer.cs
- WebSysDisplayNameAttribute.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- FreezableDefaultValueFactory.cs
- AnchoredBlock.cs
- TextEffectResolver.cs
- EditorServiceContext.cs
- AssemblyCache.cs
- DataIdProcessor.cs
- RuntimeEnvironment.cs
- PrintPreviewGraphics.cs
- WsatExtendedInformation.cs
- UriWriter.cs
- TypeDescriptorFilterService.cs
- PerfProviderCollection.cs
- SatelliteContractVersionAttribute.cs
- AssemblyBuilder.cs
- AnonymousIdentificationSection.cs
- CacheChildrenQuery.cs
- TransactionFormatter.cs
- EventPrivateKey.cs
- _AcceptOverlappedAsyncResult.cs
- LZCodec.cs
- Serializer.cs
- LayoutExceptionEventArgs.cs
- WeakReferenceKey.cs
- DataControlFieldCollection.cs
- RoleGroup.cs
- XmlUnspecifiedAttribute.cs
- TTSEngineProxy.cs
- OutputCacheProviderCollection.cs
- MediaContext.cs
- DiscreteKeyFrames.cs
- StatusBarPanel.cs
- KnownTypesProvider.cs
- DocumentDesigner.cs
- ToolBarButton.cs
- ReflectionTypeLoadException.cs
- InvokeHandlers.cs
- XmlBinaryReader.cs
- ChannelTracker.cs
- HtmlElementEventArgs.cs
- DefaultPropertyAttribute.cs
- CustomErrorCollection.cs
- PropertyFilter.cs
- EdmError.cs
- InkCanvasFeedbackAdorner.cs
- CheckedListBox.cs
- RegisteredScript.cs
- ADMembershipUser.cs
- BitmapImage.cs
- Span.cs
- EffectiveValueEntry.cs
- DiscoveryCallbackBehavior.cs
- SafeUserTokenHandle.cs
- HtmlTitle.cs
- ValidationRule.cs
- Transform.cs
- ValueTypePropertyReference.cs
- RecoverInstanceLocksCommand.cs
- ReadOnlyHierarchicalDataSource.cs
- MailBnfHelper.cs
- CornerRadiusConverter.cs
- SqlVisitor.cs
- ToolStripItemBehavior.cs
- MouseActionValueSerializer.cs
- TextTreeObjectNode.cs
- AdCreatedEventArgs.cs
- DataContext.cs
- ColorTransform.cs
- WebRequestModuleElement.cs
- XmlFormatExtensionPrefixAttribute.cs
- CustomAttributeSerializer.cs
- InvokeProviderWrapper.cs