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
- LinkedList.cs
- CompatibleComparer.cs
- SystemPens.cs
- Message.cs
- DispatcherProcessingDisabled.cs
- followingsibling.cs
- _AcceptOverlappedAsyncResult.cs
- SizeLimitedCache.cs
- MatrixConverter.cs
- ParentQuery.cs
- EnvelopedPkcs7.cs
- Geometry3D.cs
- EtwTrace.cs
- ToolStripRenderEventArgs.cs
- ApplicationSecurityManager.cs
- FunctionNode.cs
- UrlMappingsModule.cs
- FieldNameLookup.cs
- PasswordDeriveBytes.cs
- WithParamAction.cs
- FixedDocumentSequencePaginator.cs
- CanonicalizationDriver.cs
- DataGridViewAutoSizeColumnModeEventArgs.cs
- Random.cs
- Version.cs
- Pts.cs
- ToolStripDropTargetManager.cs
- DbProviderSpecificTypePropertyAttribute.cs
- VerifyHashRequest.cs
- RewritingSimplifier.cs
- IntegrationExceptionEventArgs.cs
- SoapObjectWriter.cs
- DbConnectionFactory.cs
- AnyReturnReader.cs
- TypeUtils.cs
- RectangleGeometry.cs
- Privilege.cs
- EntityModelBuildProvider.cs
- HtmlString.cs
- InitiatorSessionSymmetricTransportSecurityProtocol.cs
- Font.cs
- MsmqVerifier.cs
- PointHitTestParameters.cs
- DummyDataSource.cs
- XsdDataContractImporter.cs
- PointHitTestResult.cs
- PresentationTraceSources.cs
- DocumentationServerProtocol.cs
- XmlLanguage.cs
- IgnoreFlushAndCloseStream.cs
- WeakReferenceKey.cs
- ResourceWriter.cs
- DataGridItemCollection.cs
- RTTrackingProfile.cs
- SqlDataSourceCommandParser.cs
- UIElement.cs
- PersonalizationAdministration.cs
- ManagedWndProcTracker.cs
- Or.cs
- ClaimTypes.cs
- AdCreatedEventArgs.cs
- XmlHierarchyData.cs
- PageContentAsyncResult.cs
- thaishape.cs
- SymDocumentType.cs
- COM2FontConverter.cs
- QueryParameter.cs
- SerializationEventsCache.cs
- Endpoint.cs
- DbProviderFactories.cs
- MsmqInputChannelBase.cs
- DataGridTemplateColumn.cs
- ThicknessAnimationUsingKeyFrames.cs
- ContentFilePart.cs
- WindowsBrush.cs
- CursorConverter.cs
- ManagementBaseObject.cs
- AgileSafeNativeMemoryHandle.cs
- RuntimeIdentifierPropertyAttribute.cs
- CryptographicAttribute.cs
- ScriptingWebServicesSectionGroup.cs
- FixedSOMFixedBlock.cs
- XmlWhitespace.cs
- GridViewColumnHeader.cs
- LineGeometry.cs
- TableStyle.cs
- HexParser.cs
- NamedPipeAppDomainProtocolHandler.cs
- JsonSerializer.cs
- TraceData.cs
- AnnotationHighlightLayer.cs
- IPeerNeighbor.cs
- DataGridCell.cs
- ObjectListItemCollection.cs
- documentsequencetextcontainer.cs
- MediaSystem.cs
- VectorConverter.cs
- XPathNavigatorKeyComparer.cs
- SystemTcpStatistics.cs
- DescendentsWalker.cs