Code:
/ 4.0 / 4.0 / 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. //------------------------------------------------------------------------------ // 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
- SecondaryIndexDefinition.cs
- ActiveXContainer.cs
- GeneralTransformGroup.cs
- KeyMatchBuilder.cs
- CrossAppDomainChannel.cs
- WebPartConnectVerb.cs
- ProfileService.cs
- SafeRightsManagementQueryHandle.cs
- ManagementInstaller.cs
- TcpConnectionPool.cs
- WebPartDescription.cs
- PeerName.cs
- DoubleAnimationBase.cs
- EnumMember.cs
- OdbcDataReader.cs
- FontFamilyValueSerializer.cs
- WindowsTreeView.cs
- CodeRemoveEventStatement.cs
- DynamicMetaObjectBinder.cs
- DataGridViewCellStyleConverter.cs
- AttachmentCollection.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- VisualStyleElement.cs
- ExpressionVisitorHelpers.cs
- Mapping.cs
- LineMetrics.cs
- InvalidEnumArgumentException.cs
- WebHttpDispatchOperationSelectorData.cs
- UIElementParaClient.cs
- FixedTextSelectionProcessor.cs
- LinqExpressionNormalizer.cs
- ByeMessageCD1.cs
- LabelAutomationPeer.cs
- IPipelineRuntime.cs
- Exceptions.cs
- RoleBoolean.cs
- PathTooLongException.cs
- RepeaterItemEventArgs.cs
- XPathAxisIterator.cs
- TaiwanLunisolarCalendar.cs
- DmlSqlGenerator.cs
- KnownTypes.cs
- DispatcherTimer.cs
- BackEase.cs
- Cursor.cs
- XPathSingletonIterator.cs
- OdbcTransaction.cs
- XmlLoader.cs
- HttpModulesInstallComponent.cs
- CapabilitiesPattern.cs
- PointLightBase.cs
- BindingsCollection.cs
- Walker.cs
- ToolBar.cs
- HtmlTernaryTree.cs
- CompositeCollection.cs
- SqlBinder.cs
- MsmqIntegrationMessageProperty.cs
- BamlRecords.cs
- SynchronizedDispatch.cs
- ApplicationSecurityInfo.cs
- xdrvalidator.cs
- SeparatorAutomationPeer.cs
- ImageInfo.cs
- XmlIgnoreAttribute.cs
- ListControlDesigner.cs
- SettingsSavedEventArgs.cs
- XmlQueryType.cs
- ComplexPropertyEntry.cs
- SQLDouble.cs
- PropertyChangedEventManager.cs
- SiteMapHierarchicalDataSourceView.cs
- DoubleLinkList.cs
- MenuItem.cs
- DataViewManagerListItemTypeDescriptor.cs
- HtmlTableRowCollection.cs
- SelectiveScrollingGrid.cs
- SafeNativeMethods.cs
- PropertyDescriptor.cs
- ClearTypeHintValidation.cs
- ObjectItemLoadingSessionData.cs
- EntityDataSourceValidationException.cs
- Animatable.cs
- DesignTimeVisibleAttribute.cs
- TextSyndicationContent.cs
- GridViewCancelEditEventArgs.cs
- StrokeRenderer.cs
- DocumentsTrace.cs
- EntityDataSourceWrapperPropertyDescriptor.cs
- PropertyPathWorker.cs
- AsyncCompletedEventArgs.cs
- TextEndOfSegment.cs
- FileUtil.cs
- NamespaceEmitter.cs
- DetailsViewRow.cs
- SessionEndingCancelEventArgs.cs
- EdgeProfileValidation.cs
- ToolstripProfessionalRenderer.cs
- VBIdentifierName.cs
- TemplatePagerField.cs