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
- DataPagerFieldCommandEventArgs.cs
- XmlNodeChangedEventArgs.cs
- ModuleBuilderData.cs
- ApplicationSecurityManager.cs
- DynamicEntity.cs
- HttpMethodConstraint.cs
- Clock.cs
- ImageSourceConverter.cs
- WebPartTransformerAttribute.cs
- TypeLibConverter.cs
- KerberosRequestorSecurityToken.cs
- CodeDirectoryCompiler.cs
- GridToolTip.cs
- WorkflowServiceNamespace.cs
- LocationFactory.cs
- ResXBuildProvider.cs
- JsonDeserializer.cs
- ComplusTypeValidator.cs
- BitmapEffectGeneralTransform.cs
- DiscoveryServerProtocol.cs
- AttachInfo.cs
- ZipPackagePart.cs
- BypassElement.cs
- MenuBase.cs
- PersonalizablePropertyEntry.cs
- Misc.cs
- oledbmetadatacolumnnames.cs
- ContainerUIElement3D.cs
- TextPattern.cs
- PolyLineSegmentFigureLogic.cs
- SiteMapDataSource.cs
- WorkflowMarkupSerializerMapping.cs
- ChainedAsyncResult.cs
- XmlDictionaryReaderQuotasElement.cs
- GridViewRowPresenter.cs
- fixedPageContentExtractor.cs
- RewritingProcessor.cs
- DataRelationCollection.cs
- ChildDocumentBlock.cs
- RawTextInputReport.cs
- Point3DValueSerializer.cs
- IPAddressCollection.cs
- ComponentDispatcherThread.cs
- NavigationWindowAutomationPeer.cs
- TableSectionStyle.cs
- ClientApiGenerator.cs
- ObjectListFieldCollection.cs
- _SslState.cs
- IssuedTokenClientBehaviorsElement.cs
- ScrollChrome.cs
- TableSectionStyle.cs
- CategoryNameCollection.cs
- XamlTypeMapperSchemaContext.cs
- BulletedListEventArgs.cs
- AbstractDataSvcMapFileLoader.cs
- ConnectionPointCookie.cs
- DefaultValueTypeConverter.cs
- _SSPIWrapper.cs
- LogWriteRestartAreaAsyncResult.cs
- BinaryReader.cs
- FlowPosition.cs
- basecomparevalidator.cs
- DrawingState.cs
- AutomationPatternInfo.cs
- SerializationTrace.cs
- ActiveDocumentEvent.cs
- DataGridViewIntLinkedList.cs
- WmlLiteralTextAdapter.cs
- TextTreeUndo.cs
- Vector3DCollectionConverter.cs
- ServiceDesigner.cs
- FixedTextContainer.cs
- AuthenticationManager.cs
- ToolStripLocationCancelEventArgs.cs
- JulianCalendar.cs
- TextElementAutomationPeer.cs
- ArglessEventHandlerProxy.cs
- CodeGeneratorOptions.cs
- AssociatedControlConverter.cs
- dbdatarecord.cs
- EntityDataReader.cs
- DrawingDrawingContext.cs
- ReferenceEqualityComparer.cs
- RawStylusSystemGestureInputReport.cs
- AsyncCodeActivity.cs
- TimeSpanStorage.cs
- TypeNameHelper.cs
- TextRange.cs
- SplineKeyFrames.cs
- GetRecipientListRequest.cs
- ContainerFilterService.cs
- PropertyPathWorker.cs
- DataContractAttribute.cs
- FileClassifier.cs
- EntityCollection.cs
- RangeValueProviderWrapper.cs
- ZipIOLocalFileBlock.cs
- WebPartVerbCollection.cs
- MediaContextNotificationWindow.cs
- SHA1.cs