Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Serialization / System / Runtime / Serialization / XPathQueryGenerator.cs / 1305376 / XPathQueryGenerator.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Runtime.Serialization { using System; using System.Text; using System.Reflection; using System.Globalization; using System.Collections.Generic; using System.Xml; public static class XPathQueryGenerator { const string XPathSeparator = "/"; const string NsSeparator = ":"; public static string CreateFromDataContractSerializer(Type type, MemberInfo[] pathToMember, out XmlNamespaceManager namespaces) { return CreateFromDataContractSerializer(type, pathToMember, null, out namespaces); } // Here you can provide your own root element Xpath which will replace the Xpath of the top level element public static string CreateFromDataContractSerializer(Type type, MemberInfo[] pathToMember, StringBuilder rootElementXpath, out XmlNamespaceManager namespaces) { if (type == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("type")); } if (pathToMember == null) { throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("pathToMember")); } DataContract currentContract = DataContract.GetDataContract(type); ExportContext context; if (rootElementXpath == null) { context = new ExportContext(currentContract); } else { // use the provided xpath for top level element context = new ExportContext(rootElementXpath); } for (int pathToMemberIndex = 0; pathToMemberIndex < pathToMember.Length; pathToMemberIndex++) { currentContract = ProcessDataContract(currentContract, context, pathToMember[pathToMemberIndex]); } namespaces = context.Namespaces; return context.XPath; } static DataContract ProcessDataContract(DataContract contract, ExportContext context, MemberInfo memberNode) { if (contract is ClassDataContract) { return ProcessClassDataContract((ClassDataContract)contract, context, memberNode); } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.QueryGeneratorPathToMemberNotFound))); } static DataContract ProcessClassDataContract(ClassDataContract contract, ExportContext context, MemberInfo memberNode) { string prefix = context.SetNamespace(contract.Namespace.Value); if (contract.Members != null) { foreach (DataMember member in contract.Members) { if (member.MemberInfo == memberNode) { context.WriteChildToContext(member, prefix); return member.MemberTypeContract; } } } throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString(SR.QueryGeneratorPathToMemberNotFound))); } class ExportContext { XmlNamespaceManager namespaces; int nextPrefix; StringBuilder xPathBuilder; public ExportContext(DataContract rootContract) { this.namespaces = new XmlNamespaceManager(new NameTable()); string prefix = SetNamespace(rootContract.TopLevelElementNamespace.Value); this.xPathBuilder = new StringBuilder(XPathQueryGenerator.XPathSeparator + prefix + XPathQueryGenerator.NsSeparator + rootContract.TopLevelElementName.Value); } public ExportContext(StringBuilder rootContractXPath) { this.namespaces = new XmlNamespaceManager(new NameTable()); this.xPathBuilder = rootContractXPath; } public void WriteChildToContext(DataMember contextMember, string prefix) { this.xPathBuilder.Append(XPathQueryGenerator.XPathSeparator + prefix + XPathQueryGenerator.NsSeparator + contextMember.Name); } public XmlNamespaceManager Namespaces { get { return this.namespaces; } } public string XPath { get { return this.xPathBuilder.ToString(); } } public string SetNamespace(string ns) { string prefix = namespaces.LookupPrefix(ns); if (prefix == null || prefix.Length == 0) { prefix = "xg" + (this.nextPrefix++).ToString(NumberFormatInfo.InvariantInfo); Namespaces.AddNamespace(prefix, ns); } return prefix; } } } } // 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
- ExtensionQuery.cs
- Mapping.cs
- TypeDescriptor.cs
- TextOptions.cs
- ScrollChangedEventArgs.cs
- AnnotationHighlightLayer.cs
- ListBox.cs
- ToolStripLocationCancelEventArgs.cs
- XmlDictionaryWriter.cs
- Empty.cs
- PassportAuthentication.cs
- Logging.cs
- DesignerCatalogPartChrome.cs
- WeakRefEnumerator.cs
- SrgsRuleRef.cs
- ConfigurationManagerHelperFactory.cs
- OleDbTransaction.cs
- Identity.cs
- CqlParserHelpers.cs
- NegotiationTokenAuthenticatorStateCache.cs
- ScriptControlManager.cs
- Expression.cs
- EntityContainerEntitySet.cs
- KeyPullup.cs
- DetailsViewUpdatedEventArgs.cs
- entitydatasourceentitysetnameconverter.cs
- Matrix.cs
- AmbientProperties.cs
- GeneralTransformCollection.cs
- PhysicalFontFamily.cs
- cache.cs
- WrappedOptions.cs
- TakeOrSkipWhileQueryOperator.cs
- Renderer.cs
- Decorator.cs
- XamlReaderHelper.cs
- DataControlExtensions.cs
- OrderedDictionary.cs
- GlyphManager.cs
- CommandField.cs
- RepeaterCommandEventArgs.cs
- RepeatBehavior.cs
- Oid.cs
- VisualStateManager.cs
- Utility.cs
- Menu.cs
- ConfigXmlWhitespace.cs
- ToolTip.cs
- TimeSpanValidatorAttribute.cs
- ValidationHelper.cs
- Renderer.cs
- TextSpanModifier.cs
- PolicyLevel.cs
- FeatureManager.cs
- SqlConnectionFactory.cs
- CommandHelpers.cs
- LabelDesigner.cs
- ConditionCollection.cs
- ReservationCollection.cs
- IndexedWhereQueryOperator.cs
- DataPagerFieldCommandEventArgs.cs
- InfoCardSymmetricAlgorithm.cs
- DbProviderServices.cs
- DecoratedNameAttribute.cs
- MouseCaptureWithinProperty.cs
- ApplicationContext.cs
- MappingMetadataHelper.cs
- ResourceFallbackManager.cs
- HideDisabledControlAdapter.cs
- ExpressionBuilderCollection.cs
- CompilationSection.cs
- MediaScriptCommandRoutedEventArgs.cs
- TemplateInstanceAttribute.cs
- DateTimeFormat.cs
- InkPresenter.cs
- DispatcherSynchronizationContext.cs
- DocumentViewerAutomationPeer.cs
- TdsParserSafeHandles.cs
- TemplateDefinition.cs
- EntityDataSourceContainerNameConverter.cs
- WriteFileContext.cs
- XmlNamespaceMappingCollection.cs
- DataGridViewCellConverter.cs
- ErrorWebPart.cs
- safex509handles.cs
- RawStylusActions.cs
- InvalidEnumArgumentException.cs
- ActivityDesignerResources.cs
- PartialArray.cs
- DataGridViewImageCell.cs
- OptimisticConcurrencyException.cs
- DynamicDocumentPaginator.cs
- ContextBase.cs
- COM2Properties.cs
- BitStream.cs
- HtmlTitle.cs
- ArrayElementGridEntry.cs
- ChtmlTextWriter.cs
- CallbackDebugElement.cs
- SafeLibraryHandle.cs