/// <summary> /// Writes the property start element. /// </summary> /// <param name="beforePropertyCallback">Action called before anything else is written (if it's not null).</param> /// <param name="propertyName">The name of the property to write.</param> /// <param name="isWritingCollection">true if we are writing a collection instead of an entry.</param> /// <param name="isTopLevel">true if writing a top-level property payload; otherwise false.</param> private void WritePropertyStart(Action beforePropertyCallback, string propertyName, bool isWritingCollection, bool isTopLevel) { if (beforePropertyCallback != null) { beforePropertyCallback(); } // <d:propertyname> this.XmlWriter.WriteStartElement( isWritingCollection ? string.Empty : AtomConstants.ODataNamespacePrefix, propertyName, this.MessageWriterSettings.WriterBehavior.ODataNamespace); if (isTopLevel) { DefaultNamespaceFlags namespaces = DefaultNamespaceFlags.ODataMetadata | DefaultNamespaceFlags.Gml | DefaultNamespaceFlags.GeoRss; if (!this.MessageWriterSettings.AlwaysUseDefaultXmlNamespaceForRootElement) { // DEVNOTE: no need to include the OData namespace here, because we already defined it above. // However, the order will change if we leave it to XmlWriter to add it. So, if the knob hasn't been flipped, // manually add it. namespaces |= DefaultNamespaceFlags.OData; } this.WriteDefaultNamespaceAttributes(namespaces); } }
internal void WriteDefaultNamespaceAttributes(DefaultNamespaceFlags flags) { if ((flags & DefaultNamespaceFlags.Atom) == DefaultNamespaceFlags.Atom) { this.XmlWriter.WriteAttributeString("xmlns", "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2005/Atom"); } if ((flags & DefaultNamespaceFlags.OData) == DefaultNamespaceFlags.OData) { this.XmlWriter.WriteAttributeString("d", "http://www.w3.org/2000/xmlns/", base.MessageWriterSettings.WriterBehavior.ODataNamespace); } if ((flags & DefaultNamespaceFlags.ODataMetadata) == DefaultNamespaceFlags.ODataMetadata) { this.XmlWriter.WriteAttributeString("m", "http://www.w3.org/2000/xmlns/", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); } if (((ODataVersion) base.MessageWriterSettings.Version.Value) >= ODataVersion.V3) { if ((flags & DefaultNamespaceFlags.GeoRss) == DefaultNamespaceFlags.GeoRss) { this.XmlWriter.WriteAttributeString("georss", "http://www.w3.org/2000/xmlns/", "http://www.georss.org/georss"); } if ((flags & DefaultNamespaceFlags.Gml) == DefaultNamespaceFlags.Gml) { this.XmlWriter.WriteAttributeString("gml", "http://www.w3.org/2000/xmlns/", "http://www.opengis.net/gml"); } } }
internal void WriteDefaultNamespaceAttributes(DefaultNamespaceFlags flags) { if ((flags & DefaultNamespaceFlags.Atom) == DefaultNamespaceFlags.Atom) { this.XmlWriter.WriteAttributeString("xmlns", "http://www.w3.org/2000/xmlns/", "http://www.w3.org/2005/Atom"); } if ((flags & DefaultNamespaceFlags.OData) == DefaultNamespaceFlags.OData) { this.XmlWriter.WriteAttributeString("d", "http://www.w3.org/2000/xmlns/", base.MessageWriterSettings.WriterBehavior.ODataNamespace); } if ((flags & DefaultNamespaceFlags.ODataMetadata) == DefaultNamespaceFlags.ODataMetadata) { this.XmlWriter.WriteAttributeString("m", "http://www.w3.org/2000/xmlns/", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"); } if (((ODataVersion)base.MessageWriterSettings.Version.Value) >= ODataVersion.V3) { if ((flags & DefaultNamespaceFlags.GeoRss) == DefaultNamespaceFlags.GeoRss) { this.XmlWriter.WriteAttributeString("georss", "http://www.w3.org/2000/xmlns/", "http://www.georss.org/georss"); } if ((flags & DefaultNamespaceFlags.Gml) == DefaultNamespaceFlags.Gml) { this.XmlWriter.WriteAttributeString("gml", "http://www.w3.org/2000/xmlns/", "http://www.opengis.net/gml"); } } }
/// <summary> /// Write the namespaces for OData (prefix 'd') and OData metadata (prefix 'm') /// </summary> /// <param name="flags">An enumeration value to indicate what default namespace attributes to write.</param> internal void WriteDefaultNamespaceAttributes(DefaultNamespaceFlags flags) { Debug.Assert(this.MessageWriterSettings.Version.HasValue, "Version must be set by now."); if ((flags & DefaultNamespaceFlags.Atom) == DefaultNamespaceFlags.Atom) { this.XmlWriter.WriteAttributeString(AtomConstants.XmlnsNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.AtomNamespace); } if ((flags & DefaultNamespaceFlags.OData) == DefaultNamespaceFlags.OData) { this.XmlWriter.WriteAttributeString(AtomConstants.ODataNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.ODataNamespace); } if ((flags & DefaultNamespaceFlags.ODataMetadata) == DefaultNamespaceFlags.ODataMetadata) { this.XmlWriter.WriteAttributeString(AtomConstants.ODataMetadataNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.ODataMetadataNamespace); } if ((flags & DefaultNamespaceFlags.GeoRss) == DefaultNamespaceFlags.GeoRss) { this.XmlWriter.WriteAttributeString(AtomConstants.GeoRssPrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.GeoRssNamespace); } if ((flags & DefaultNamespaceFlags.Gml) == DefaultNamespaceFlags.Gml) { this.XmlWriter.WriteAttributeString(AtomConstants.GmlPrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.GmlNamespace); } }
/// <summary> /// Write the namespaces for OData (prefix 'd') and OData metadata (prefix 'm') /// </summary> /// <param name="writer">The Xml writer to write to.</param> /// <param name="flags">An enumeration value to indicate what default namespace attributes to write.</param> private static void WriteDefaultNamespaceAttributes(XmlWriter writer, DefaultNamespaceFlags flags) { DebugUtils.CheckNoExternalCallers(); if ((flags & DefaultNamespaceFlags.Atom) == DefaultNamespaceFlags.Atom) { writer.WriteAttributeString( AtomConstants.XmlnsNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.AtomNamespace); } if ((flags & DefaultNamespaceFlags.OData) == DefaultNamespaceFlags.OData) { writer.WriteAttributeString( AtomConstants.ODataNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.ODataNamespace); } if ((flags & DefaultNamespaceFlags.ODataMetadata) == DefaultNamespaceFlags.ODataMetadata) { writer.WriteAttributeString( AtomConstants.ODataMetadataNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.ODataMetadataNamespace); } }
/// <summary> /// Write the namespaces for OData (prefix 'd') and OData metadata (prefix 'm') /// </summary> /// <param name="flags">An enumeration value to indicate what default namespace attributes to write.</param> internal void WriteDefaultNamespaceAttributes(DefaultNamespaceFlags flags) { DebugUtils.CheckNoExternalCallers(); Debug.Assert(this.MessageWriterSettings.Version.HasValue, "Version must be set by now."); if ((flags & DefaultNamespaceFlags.Atom) == DefaultNamespaceFlags.Atom) { this.XmlWriter.WriteAttributeString( AtomConstants.XmlnsNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.AtomNamespace); } if ((flags & DefaultNamespaceFlags.OData) == DefaultNamespaceFlags.OData) { this.XmlWriter.WriteAttributeString( AtomConstants.ODataNamespacePrefix, AtomConstants.XmlNamespacesNamespace, this.MessageWriterSettings.WriterBehavior.ODataNamespace); } if ((flags & DefaultNamespaceFlags.ODataMetadata) == DefaultNamespaceFlags.ODataMetadata) { this.XmlWriter.WriteAttributeString( AtomConstants.ODataMetadataNamespacePrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.ODataMetadataNamespace); } // Only write the spatial namespaces for versions >= V3 if (this.MessageWriterSettings.Version.Value >= ODataVersion.V3) { if ((flags & DefaultNamespaceFlags.GeoRss) == DefaultNamespaceFlags.GeoRss) { this.XmlWriter.WriteAttributeString( AtomConstants.GeoRssPrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.GeoRssNamespace); } if ((flags & DefaultNamespaceFlags.Gml) == DefaultNamespaceFlags.Gml) { this.XmlWriter.WriteAttributeString( AtomConstants.GmlPrefix, AtomConstants.XmlNamespacesNamespace, AtomConstants.GmlNamespace); } } }
/// <summary> /// Writes the property start element. /// </summary> /// <param name="beforePropertyCallback">Action called before anything else is written (if it's not null).</param> /// <param name="propertyName">The name of the property to write.</param> /// <param name="value">The odata value to write.</param> /// <param name="isWritingCollection">true if we are writing a collection instead of an entry.</param> /// <param name="isTopLevel">true if writing a top-level property payload; otherwise false.</param> private void WritePropertyStart(Action beforePropertyCallback, string propertyName, ODataValue value, bool isWritingCollection, bool isTopLevel) { if (beforePropertyCallback != null) { beforePropertyCallback(); } if (!isTopLevel) { // <d:propertyname> this.XmlWriter.WriteStartElement( isWritingCollection ? string.Empty : AtomConstants.ODataNamespacePrefix, propertyName, AtomConstants.ODataNamespace); } else { // <m:value> this.XmlWriter.WriteStartElement( AtomConstants.ODataMetadataNamespacePrefix, AtomConstants.ODataValueElementName, AtomConstants.ODataMetadataNamespace); // COMPAT 24: Use standard ('d' and 'm') namespace prefixes for top-level property payloads // Top-level collection payloads don't write namespace declarations on the root element (except for the d namespace) // We decided to use the same set of default namespaces on entries, feeds, collections and top-level properties DefaultNamespaceFlags namespaces = DefaultNamespaceFlags.Gml | DefaultNamespaceFlags.GeoRss; if (!this.MessageWriterSettings.AlwaysUseDefaultXmlNamespaceForRootElement) { // DEVNOTE: no need to include the OData namespace here, because we already defined it above. // However, the order will change if we leave it to XmlWriter to add it. So, if the knob hasn't been flipped, // manually add it. namespaces |= DefaultNamespaceFlags.OData; } this.WriteDefaultNamespaceAttributes(namespaces); ODataContextUriBuilder contextUriBuilder = this.AtomOutputContext.CreateContextUriBuilder(); ODataPayloadKind kind = this.AtomOutputContext.MessageWriterSettings.IsIndividualProperty ? ODataPayloadKind.IndividualProperty : ODataPayloadKind.Property; ODataContextUrlInfo contextInfo = ODataContextUrlInfo.Create(value, this.AtomOutputContext.MessageWriterSettings.ODataUri); this.WriteContextUriProperty(contextUriBuilder.BuildContextUri(kind, contextInfo)); } }