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
- KeyManager.cs
- SrgsToken.cs
- CodeMemberField.cs
- SafeCryptHandles.cs
- ResourceExpressionBuilder.cs
- InternalSafeNativeMethods.cs
- GenericIdentity.cs
- SharedPerformanceCounter.cs
- PngBitmapDecoder.cs
- filewebrequest.cs
- ThrowHelper.cs
- ProcessInfo.cs
- PartitionedStream.cs
- GridViewRowEventArgs.cs
- ToolStripRenderer.cs
- TriState.cs
- LogConverter.cs
- MultiViewDesigner.cs
- UrlMappingCollection.cs
- DomNameTable.cs
- PointAnimationUsingKeyFrames.cs
- TextTreeTextElementNode.cs
- NamedObject.cs
- DataSetFieldSchema.cs
- UnknownBitmapDecoder.cs
- MemberHolder.cs
- HttpPostServerProtocol.cs
- SecUtil.cs
- UnmanagedBitmapWrapper.cs
- MarkupCompiler.cs
- IRCollection.cs
- SqlColumnizer.cs
- XmlTextAttribute.cs
- ImagingCache.cs
- ModuleConfigurationInfo.cs
- GridViewSelectEventArgs.cs
- NumberEdit.cs
- EditorPartDesigner.cs
- WebConvert.cs
- StreamAsIStream.cs
- ConditionalDesigner.cs
- FrameworkElementFactoryMarkupObject.cs
- TextTrailingCharacterEllipsis.cs
- Matrix3DValueSerializer.cs
- ExceptionUtility.cs
- OdbcFactory.cs
- ImplicitInputBrush.cs
- TreeNode.cs
- TreeBuilderXamlTranslator.cs
- _TimerThread.cs
- ContainerSelectorGlyph.cs
- prompt.cs
- LicenseException.cs
- OpenTypeLayout.cs
- CmsUtils.cs
- FontStyle.cs
- XhtmlBasicLinkAdapter.cs
- SessionPageStatePersister.cs
- XmlRawWriter.cs
- UniformGrid.cs
- StorageRoot.cs
- PointIndependentAnimationStorage.cs
- MulticastNotSupportedException.cs
- XmlParserContext.cs
- UIElement.cs
- SpanIndex.cs
- XmlNamedNodeMap.cs
- Point3DAnimation.cs
- GetLastErrorDetailsRequest.cs
- XmlNamespaceManager.cs
- WebBrowserPermission.cs
- FormViewCommandEventArgs.cs
- XmlSchemaSimpleContentRestriction.cs
- BuildResultCache.cs
- DataView.cs
- _ConnectionGroup.cs
- ArgIterator.cs
- Axis.cs
- UnsafeNativeMethods.cs
- RecognizerInfo.cs
- EnglishPluralizationService.cs
- PropertyChangeTracker.cs
- InvalidComObjectException.cs
- Evidence.cs
- RemoveStoryboard.cs
- QilFactory.cs
- VScrollProperties.cs
- Int16Storage.cs
- ToolStripDropDownClosingEventArgs.cs
- EntityDataSourceValidationException.cs
- SqlTopReducer.cs
- EventPropertyMap.cs
- WindowsRegion.cs
- OleCmdHelper.cs
- Run.cs
- SystemInfo.cs
- SoundPlayerAction.cs
- XmlBinaryReaderSession.cs
- XslCompiledTransform.cs
- HttpInputStream.cs