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
- ButtonBaseAutomationPeer.cs
- EntityProviderServices.cs
- TypeRefElement.cs
- NestedContainer.cs
- ResourceKey.cs
- AsyncSerializedWorker.cs
- WizardStepBase.cs
- CollectionViewSource.cs
- FileDialog_Vista_Interop.cs
- DataGridRowEventArgs.cs
- LayoutEngine.cs
- DataGridViewCellStyleChangedEventArgs.cs
- DataControlButton.cs
- AttachedPropertyDescriptor.cs
- Icon.cs
- FactoryGenerator.cs
- StylusPointCollection.cs
- TextRunTypographyProperties.cs
- RecognitionEventArgs.cs
- ContainerUtilities.cs
- DrawingServices.cs
- ScrollEvent.cs
- DbModificationCommandTree.cs
- UnmanagedMarshal.cs
- GraphicsPath.cs
- MatrixIndependentAnimationStorage.cs
- ProxyWebPartConnectionCollection.cs
- WinFormsUtils.cs
- PropertyEmitterBase.cs
- ColorTranslator.cs
- dsa.cs
- ToolStripContainer.cs
- Graphics.cs
- StoreItemCollection.Loader.cs
- ApplicationBuildProvider.cs
- Number.cs
- TiffBitmapEncoder.cs
- XsltSettings.cs
- DataSourceSelectArguments.cs
- GlyphCollection.cs
- DesignTimeTemplateParser.cs
- NativeObjectSecurity.cs
- IERequestCache.cs
- DataTableMapping.cs
- XPathNavigatorKeyComparer.cs
- NetPeerTcpBinding.cs
- DetailsViewCommandEventArgs.cs
- TableLayoutPanel.cs
- GridViewDeletedEventArgs.cs
- ContractCodeDomInfo.cs
- SessionPageStateSection.cs
- __FastResourceComparer.cs
- DocumentCollection.cs
- XmlSchemaObjectTable.cs
- ErrorTableItemStyle.cs
- QilPatternVisitor.cs
- __Filters.cs
- ColumnMapProcessor.cs
- CodeTypeReference.cs
- Assign.cs
- InstalledVoice.cs
- _LocalDataStore.cs
- BamlCollectionHolder.cs
- FunctionUpdateCommand.cs
- RegexCompilationInfo.cs
- DataSourceCacheDurationConverter.cs
- EventManager.cs
- MarkupCompilePass2.cs
- ModuleBuilder.cs
- DataListItem.cs
- BinHexEncoder.cs
- ObjectSecurity.cs
- ApplicationFileParser.cs
- SmiRequestExecutor.cs
- HttpModuleCollection.cs
- __Error.cs
- FilterQuery.cs
- TextBoxBase.cs
- ListSortDescriptionCollection.cs
- GridSplitter.cs
- XmlIlVisitor.cs
- columnmapkeybuilder.cs
- Normalization.cs
- DataGridViewDataConnection.cs
- CodeNamespaceImportCollection.cs
- ThicknessConverter.cs
- EntityCommandDefinition.cs
- Table.cs
- GetPageCompletedEventArgs.cs
- EdmItemError.cs
- TextRangeProviderWrapper.cs
- Events.cs
- UniqueIdentifierService.cs
- ImageBrush.cs
- Line.cs
- HttpProtocolReflector.cs
- ProviderUtil.cs
- AuthenticatingEventArgs.cs
- KeyGestureValueSerializer.cs
- AlgoModule.cs