Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / XmlUtils / System / Xml / Xsl / Runtime / XmlNavigatorFilter.cs / 1305376 / XmlNavigatorFilter.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// [....]
//-----------------------------------------------------------------------------
using System.Xml;
using System.Xml.XPath;
using System.Diagnostics;
using System.ComponentModel;
namespace System.Xml.Xsl.Runtime {
///
/// XmlNavigatorFilter provides a flexible filtering abstraction over XPathNavigator. Callers do
/// not know what type of filtering will occur; they simply call MoveToContent or MoveToSibling.
/// The filter implementation invokes appropriate operation(s) on the XPathNavigator in order
/// to skip over filtered nodes.
///
[EditorBrowsable(EditorBrowsableState.Never)]
public abstract class XmlNavigatorFilter {
///
/// Reposition the navigator to the first matching content node (inc. attributes); skip over
/// filtered nodes. If there are no matching nodes, then don't move navigator and return false.
///
public abstract bool MoveToContent(XPathNavigator navigator);
///
/// Reposition the navigator to the next matching content node (inc. attributes); skip over
/// filtered nodes. If there are no matching nodes, then don't move navigator and return false.
///
public abstract bool MoveToNextContent(XPathNavigator navigator);
///
/// Reposition the navigator to the next following sibling node (no attributes); skip over
/// filtered nodes. If there are no matching nodes, then don't move navigator and return false.
///
public abstract bool MoveToFollowingSibling(XPathNavigator navigator);
///
/// Reposition the navigator to the previous sibling node (no attributes); skip over filtered
/// nodes. If there are no matching nodes, then don't move navigator and return false.
///
public abstract bool MoveToPreviousSibling(XPathNavigator navigator);
///
/// Reposition the navigator to the next following node (inc. descendants); skip over filtered nodes.
/// If there are no matching nodes, then return false.
///
public abstract bool MoveToFollowing(XPathNavigator navigator, XPathNavigator navigatorEnd);
///
/// Return true if the navigator's current node matches the filter condition.
///
public abstract bool IsFiltered(XPathNavigator navigator);
}
///
/// Filters any non-element and any element with a non-matching local name or namespace uri.
///
internal class XmlNavNameFilter : XmlNavigatorFilter {
private string localName;
private string namespaceUri;
///
/// Return an XmlNavigatorFilter that skips over nodes that do not match the specified name.
///
public static XmlNavigatorFilter Create(string localName, string namespaceUri) {
return new XmlNavNameFilter(localName, namespaceUri);
}
///
/// Keep only elements with name = localName, namespaceUri.
///
private XmlNavNameFilter(string localName, string namespaceUri) {
this.localName = localName;
this.namespaceUri = namespaceUri;
}
///
/// Reposition the navigator on the first element child with a matching name.
///
public override bool MoveToContent(XPathNavigator navigator) {
return navigator.MoveToChild(this.localName, this.namespaceUri);
}
///
/// Reposition the navigator on the next element child with a matching name.
///
public override bool MoveToNextContent(XPathNavigator navigator) {
return navigator.MoveToNext(this.localName, this.namespaceUri);
}
///
/// Reposition the navigator on the next element sibling with a matching name.
///
public override bool MoveToFollowingSibling(XPathNavigator navigator) {
return navigator.MoveToNext(this.localName, this.namespaceUri);
}
///
/// Reposition the navigator on the previous element sibling with a matching name.
///
public override bool MoveToPreviousSibling(XPathNavigator navigator) {
return navigator.MoveToPrevious(this.localName, this.namespaceUri);
}
///
/// Reposition the navigator on the next following element with a matching name.
///
public override bool MoveToFollowing(XPathNavigator navigator, XPathNavigator navEnd) {
return navigator.MoveToFollowing(this.localName, this.namespaceUri, navEnd);
}
///
/// Return false if the navigator is positioned on an element with a matching name.
///
public override bool IsFiltered(XPathNavigator navigator) {
return navigator.LocalName != this.localName || navigator.NamespaceURI != namespaceUri;
}
}
///
/// Filters any node not of the specified type (type may not be attribute or namespace).
///
internal class XmlNavTypeFilter : XmlNavigatorFilter {
private static XmlNavigatorFilter[] TypeFilters;
private XPathNodeType nodeType;
private int mask;
///
/// There are a limited number of types, so create all possible XmlNavTypeFilter objects just once.
///
static XmlNavTypeFilter() {
TypeFilters = new XmlNavigatorFilter[(int) XPathNodeType.Comment + 1];
TypeFilters[(int) XPathNodeType.Element] = new XmlNavTypeFilter(XPathNodeType.Element);
TypeFilters[(int) XPathNodeType.Text] = new XmlNavTypeFilter(XPathNodeType.Text);
TypeFilters[(int) XPathNodeType.ProcessingInstruction] = new XmlNavTypeFilter(XPathNodeType.ProcessingInstruction);
TypeFilters[(int) XPathNodeType.Comment] = new XmlNavTypeFilter(XPathNodeType.Comment);
}
///
/// Return a previously constructed XmlNavigatorFilter that skips over nodes that do not match the specified type.
///
public static XmlNavigatorFilter Create(XPathNodeType nodeType) {
Debug.Assert(TypeFilters[(int) nodeType] != null);
return TypeFilters[(int) nodeType];
}
///
/// Keep only nodes with XPathNodeType = nodeType, where XPathNodeType.Text selects whitespace as well.
///
private XmlNavTypeFilter(XPathNodeType nodeType) {
Debug.Assert(nodeType != XPathNodeType.Attribute && nodeType != XPathNodeType.Namespace);
this.nodeType = nodeType;
this.mask = XPathNavigator.GetContentKindMask(nodeType);
}
///
/// Reposition the navigator on the first child with a matching type.
///
public override bool MoveToContent(XPathNavigator navigator) {
return navigator.MoveToChild(this.nodeType);
}
///
/// Reposition the navigator on the next child with a matching type.
///
public override bool MoveToNextContent(XPathNavigator navigator) {
return navigator.MoveToNext(this.nodeType);
}
///
/// Reposition the navigator on the next non-attribute sibling with a matching type.
///
public override bool MoveToFollowingSibling(XPathNavigator navigator) {
return navigator.MoveToNext(this.nodeType);
}
///
/// Reposition the navigator on the previous non-attribute sibling with a matching type.
///
public override bool MoveToPreviousSibling(XPathNavigator navigator) {
return navigator.MoveToPrevious(this.nodeType);
}
///
/// Reposition the navigator on the next following element with a matching kind.
///
public override bool MoveToFollowing(XPathNavigator navigator, XPathNavigator navEnd) {
return navigator.MoveToFollowing(this.nodeType, navEnd);
}
///
/// Return false if the navigator is positioned on a node with a matching type.
///
public override bool IsFiltered(XPathNavigator navigator) {
return ((1 << (int) navigator.NodeType) & this.mask) == 0;
}
}
///
/// Filters all attribute nodes.
///
internal class XmlNavAttrFilter : XmlNavigatorFilter {
private static XmlNavigatorFilter Singleton = new XmlNavAttrFilter();
///
/// Return a singleton XmlNavigatorFilter that filters all attribute nodes.
///
public static XmlNavigatorFilter Create() {
return Singleton;
}
///
/// Constructor.
///
private XmlNavAttrFilter() {
}
///
/// Reposition the navigator on the first non-attribute child.
///
public override bool MoveToContent(XPathNavigator navigator) {
return navigator.MoveToFirstChild();
}
///
/// Reposition the navigator on the next non-attribute sibling.
///
public override bool MoveToNextContent(XPathNavigator navigator) {
return navigator.MoveToNext();
}
///
/// Reposition the navigator on the next non-attribute sibling.
///
public override bool MoveToFollowingSibling(XPathNavigator navigator) {
return navigator.MoveToNext();
}
///
/// Reposition the navigator on the previous non-attribute sibling.
///
public override bool MoveToPreviousSibling(XPathNavigator navigator) {
return navigator.MoveToPrevious();
}
///
/// Reposition the navigator on the next following non-attribute.
///
public override bool MoveToFollowing(XPathNavigator navigator, XPathNavigator navEnd) {
return navigator.MoveToFollowing(XPathNodeType.All, navEnd);
}
///
/// Return true if the navigator is positioned on an attribute.
///
public override bool IsFiltered(XPathNavigator navigator) {
return navigator.NodeType == XPathNodeType.Attribute;
}
}
///
/// Never filter nodes.
///
internal class XmlNavNeverFilter : XmlNavigatorFilter {
private static XmlNavigatorFilter Singleton = new XmlNavNeverFilter();
///
/// Return a singleton XmlNavigatorFilter that never filters any nodes.
///
public static XmlNavigatorFilter Create() {
return Singleton;
}
///
/// Constructor.
///
private XmlNavNeverFilter() {
}
///
/// Reposition the navigator on the first child (attribute or non-attribute).
///
public override bool MoveToContent(XPathNavigator navigator) {
return MoveToFirstAttributeContent(navigator);
}
///
/// Reposition the navigator on the next child (attribute or non-attribute).
///
public override bool MoveToNextContent(XPathNavigator navigator) {
return MoveToNextAttributeContent(navigator);
}
///
/// Reposition the navigator on the next sibling (no attributes).
///
public override bool MoveToFollowingSibling(XPathNavigator navigator) {
return navigator.MoveToNext();
}
///
/// Reposition the navigator on the previous sibling (no attributes).
///
public override bool MoveToPreviousSibling(XPathNavigator navigator) {
return navigator.MoveToPrevious();
}
///
/// Reposition the navigator on the next following node.
///
public override bool MoveToFollowing(XPathNavigator navigator, XPathNavigator navEnd) {
return navigator.MoveToFollowing(XPathNodeType.All, navEnd);
}
///
/// Nodes are never filtered so always return false.
///
public override bool IsFiltered(XPathNavigator navigator) {
return false;
}
///
/// Move to navigator's first attribute node. If no attribute's exist, move to the first content node.
/// If no content nodes exist, return null. Otherwise, return navigator.
///
public static bool MoveToFirstAttributeContent(XPathNavigator navigator) {
if (!navigator.MoveToFirstAttribute())
return navigator.MoveToFirstChild();
return true;
}
///
/// If navigator is positioned on an attribute, move to the next attribute node. If there are no more
/// attributes, move to the first content node. If navigator is positioned on a content node, move to
/// the next content node. If there are no more attributes and content nodes, return null.
/// Otherwise, return navigator.
///
public static bool MoveToNextAttributeContent(XPathNavigator navigator) {
if (navigator.NodeType == XPathNodeType.Attribute) {
if (!navigator.MoveToNextAttribute()) {
navigator.MoveToParent();
if (!navigator.MoveToFirstChild()) {
// No children, so reposition on original attribute
navigator.MoveToFirstAttribute();
while (navigator.MoveToNextAttribute())
;
return false;
}
}
return true;
}
return navigator.MoveToNext();
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- FontStretches.cs
- CompModSwitches.cs
- XmlNodeWriter.cs
- XmlBindingWorker.cs
- JavaScriptObjectDeserializer.cs
- FixedPageProcessor.cs
- XamlDesignerSerializationManager.cs
- BamlRecordHelper.cs
- __Filters.cs
- HttpClientCertificate.cs
- ListBoxItemAutomationPeer.cs
- PeerNameRegistration.cs
- TrackingDataItem.cs
- PnrpPermission.cs
- FileDialog_Vista_Interop.cs
- ObjectPersistData.cs
- Oid.cs
- WorkflowTimerService.cs
- WorkflowFileItem.cs
- ParseNumbers.cs
- FloaterParaClient.cs
- Mapping.cs
- ClassHandlersStore.cs
- ResourceFallbackManager.cs
- ConnectionsZone.cs
- AttachedPropertyBrowsableAttribute.cs
- ObjectHandle.cs
- SoapCodeExporter.cs
- ListItem.cs
- Pen.cs
- CombinedGeometry.cs
- PhysicalAddress.cs
- FixedSOMTableCell.cs
- XmlNamespaceManager.cs
- Byte.cs
- SchemaLookupTable.cs
- CompressStream.cs
- BufferedWebEventProvider.cs
- RelationshipConverter.cs
- BuildProvider.cs
- DesignerSerializationOptionsAttribute.cs
- RawStylusSystemGestureInputReport.cs
- GPRECT.cs
- TableLayoutRowStyleCollection.cs
- PreviewPageInfo.cs
- MemberInfoSerializationHolder.cs
- CqlLexer.cs
- EnumUnknown.cs
- DataObjectCopyingEventArgs.cs
- RtfToken.cs
- PropertyGrid.cs
- EditableLabelControl.cs
- DependencyPropertyKind.cs
- XmlHierarchicalEnumerable.cs
- IntSecurity.cs
- WebPartZone.cs
- CategoryGridEntry.cs
- ComponentResourceManager.cs
- MessageSecurityVersion.cs
- CommandValueSerializer.cs
- HtmlLink.cs
- MailMessageEventArgs.cs
- TextEndOfParagraph.cs
- SpnEndpointIdentity.cs
- BinaryFormatterWriter.cs
- HostSecurityManager.cs
- ObjectListSelectEventArgs.cs
- AspNetSynchronizationContext.cs
- InputGestureCollection.cs
- Inflater.cs
- BaseTemplatedMobileComponentEditor.cs
- NotImplementedException.cs
- SchemaConstraints.cs
- LinkGrep.cs
- DateTime.cs
- AppDomain.cs
- ReturnType.cs
- AuthenticatedStream.cs
- SystemTcpStatistics.cs
- TextElementAutomationPeer.cs
- RequestCacheManager.cs
- CompareInfo.cs
- WindowsAltTab.cs
- ErrorWebPart.cs
- DirectoryNotFoundException.cs
- DataGridViewToolTip.cs
- PassportIdentity.cs
- SchemaCreator.cs
- Line.cs
- TemplateManager.cs
- Trace.cs
- PropertyToken.cs
- Substitution.cs
- Utils.cs
- ToggleButton.cs
- CodeCompiler.cs
- MultiTouchSystemGestureLogic.cs
- TabControlAutomationPeer.cs
- ControlIdConverter.cs
- CodeLinePragma.cs