c# - 以编程方式控制 xml 元素的顺序

标签 c# xml wcf web-services serialization

我在我的 .Net 应用程序中使用第三方 Web 服务 [WS]。 我的应用程序正在使用从此 WS 的 wsdl 生成的实体类。 我从数据库中获取数据,将其填充到实体对象中,然后使用 XmlSerializer 类从中生成 xml。

WS 的方法之一需要此 xml 字符串作为输入。并且 xml 的元素顺序应与 WS 预期的顺序相同。但发生的情况是,某些元素在我的应用程序中出现颠倒,并且所以 WS 抛出一个最里面的异常,说关于序列化:。 _innerException {“顺序不一致:如果在类成员之一上使用,则所有类似粒子的成员都需要“顺序”属性,请在类成员上使用 XmlElement、XmlAnyElement 或 XmlArray 自定义属性显式设置“顺序”'仪器'。"} System.Exception {System.InvalidOperationException}

XmlSerializer serializer = new XmlSerializer(typeof(totemmessage));

所以,我的问题是,在将应用程序发送到 WS 之前,如何以编程方式控制应用程序中这些 xml 元素的顺序?注意:我不想为此目的使用 xslt。

感谢您的阅读。

这是我的实体类:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(TypeName="totem-message")] 
    [System.Xml.Serialization.XmlRootAttribute("totem", Namespace="", IsNullable=false)] 
    public partial class totemmessage  { 

        private object itemField; 

        private ItemChoiceType1 itemElementNameField; 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElementAttribute("error", typeof(errorinfo))] 
        [System.Xml.Serialization.XmlElementAttribute("parseReport", typeof(parseReportinfo))] 
        [System.Xml.Serialization.XmlElementAttribute("results", typeof(templateinfo))] 
        [System.Xml.Serialization.XmlElementAttribute("subareas", typeof(subareasinfo))] 
        [System.Xml.Serialization.XmlElementAttribute("template", typeof(templateinfo))] 
        [System.Xml.Serialization.XmlElementAttribute("upload", typeof(templateinfo))] 
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")] 
        [System.Xml.Serialization.XmlElement(Order = 0)]       
        public object Item { 
            get { 
                return this.itemField; 
            } 
            set { 
                this.itemField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 1)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()] 
        public ItemChoiceType1 ItemElementName { 
            get { 
                return this.itemElementNameField; 
            } 
            set { 
                this.itemElementNameField = value; 
            } 
        }        

    }

[System.Xml.Serialization.XmlIncludeAttribute(typeof(energyInstrument))] 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    public abstract partial class abstractEnergyInstrument { 

        private energyContractTime periodField; 

        private bool periodFieldSpecified; 

        private System.DateTime startDateField; 

        private bool startDateFieldSpecified; 

        private System.DateTime endDateField; 

        private bool endDateFieldSpecified; 

        private System.DateTime expiryDateField; 

        private bool expiryDateFieldSpecified; 

        private energyInstrumentClassifier typeField; 

        private bool typeFieldSpecified; 

        private string strikeField; 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 0)] 
        public energyContractTime period { 
            get { 
                return this.periodField; 
            } 
            set { 
                this.periodField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 1)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool periodSpecified { 
            get { 
                return this.periodFieldSpecified; 
            } 
            set { 
                this.periodFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order =2)]        
        public System.DateTime startDate { 
            get { 
                return this.startDateField; 
            } 
            set { 
                this.startDateField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 3)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool startDateSpecified { 
            get { 
                return this.startDateFieldSpecified; 
            } 
            set { 
                this.startDateFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order =4)]        
        public System.DateTime endDate { 
            get { 
                return this.endDateField; 
            } 
            set { 
                this.endDateField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 5)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool endDateSpecified { 
            get { 
                return this.endDateFieldSpecified; 
            } 
            set { 
                this.endDateFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElementAttribute(DataType="date", Order =6)]        
        public System.DateTime expiryDate { 
            get { 
                return this.expiryDateField; 
            } 
            set { 
                this.expiryDateField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 7)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool expiryDateSpecified { 
            get { 
                return this.expiryDateFieldSpecified; 
            } 
            set { 
                this.expiryDateFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 8)] 
        public energyInstrumentClassifier type { 
            get { 
                return this.typeField; 
            } 
            set { 
                this.typeField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 9)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool typeSpecified { 
            get { 
                return this.typeFieldSpecified; 
            } 
            set { 
                this.typeFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 10)] 
        public string strike { 
            get { 
                return this.strikeField; 
            } 
            set { 
                this.strikeField = value; 
            } 
        } 
    }

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlRootAttribute("instrument", Namespace="", IsNullable=false)] 
    public partial class energyInstrument : abstractEnergyInstrument { 

        private decimal priceField; 

        private bool priceFieldSpecified; 

        private decimal forwardField; 

        private bool forwardFieldSpecified; 

        private decimal volField; 

        private bool volFieldSpecified; 

        private decimal consensusPriceField; 

        private bool consensusPriceFieldSpecified; 

        private decimal compositePriceField; 

        private bool compositePriceFieldSpecified; 

        private decimal reconstitutedForwardField; 

        private bool reconstitutedForwardFieldSpecified; 

        private decimal consensusVolField; 

        private bool consensusVolFieldSpecified; 

        private decimal compositeVolField; 

        private bool compositeVolFieldSpecified; 

        private string priceOutField; 

        private decimal priceRangeField; 

        private bool priceRangeFieldSpecified; 

        private decimal priceStddevField; 

        private bool priceStddevFieldSpecified; 

        private string volOutField; 

        private decimal volRangeField; 

        private bool volRangeFieldSpecified; 

        private decimal volStddevField; 

        private bool volStddevFieldSpecified; 

        private string contributorsField; 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 0)] 
        public decimal price { 
            get { 
                return this.priceField; 
            } 
            set { 
                this.priceField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 1)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool priceSpecified { 
            get { 
                return this.priceFieldSpecified; 
            } 
            set { 
                this.priceFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 2)] 
        public decimal forward { 
            get { 
                return this.forwardField; 
            } 
            set { 
                this.forwardField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 3)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool forwardSpecified { 
            get { 
                return this.forwardFieldSpecified; 
            } 
            set { 
                this.forwardFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 4)] 
        public decimal vol { 
            get { 
                return this.volField; 
            } 
            set { 
                this.volField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 5)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool volSpecified { 
            get { 
                return this.volFieldSpecified; 
            } 
            set { 
                this.volFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 6)] 
        public decimal consensusPrice { 
            get { 
                return this.consensusPriceField; 
            } 
            set { 
                this.consensusPriceField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 7)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool consensusPriceSpecified { 
            get { 
                return this.consensusPriceFieldSpecified; 
            } 
            set { 
                this.consensusPriceFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 8)] 
        public decimal compositePrice { 
            get { 
                return this.compositePriceField; 
            } 
            set { 
                this.compositePriceField = value; 
            } 
        } 

        /// <remarks/>        
        [System.Xml.Serialization.XmlElement(Order = 9)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool compositePriceSpecified { 
            get { 
                return this.compositePriceFieldSpecified; 
            } 
            set { 
                this.compositePriceFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 10)] 
        public decimal reconstitutedForward { 
            get { 
                return this.reconstitutedForwardField; 
            } 
            set { 
                this.reconstitutedForwardField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 11)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool reconstitutedForwardSpecified { 
            get { 
                return this.reconstitutedForwardFieldSpecified; 
            } 
            set { 
                this.reconstitutedForwardFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 12)] 
        public decimal consensusVol { 
            get { 
                return this.consensusVolField; 
            } 
            set { 
                this.consensusVolField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 13)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool consensusVolSpecified { 
            get { 
                return this.consensusVolFieldSpecified; 
            } 
            set { 
                this.consensusVolFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 14)] 
        public decimal compositeVol { 
            get { 
                return this.compositeVolField; 
            } 
            set { 
                this.compositeVolField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 15)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool compositeVolSpecified { 
            get { 
                return this.compositeVolFieldSpecified; 
            } 
            set { 
                this.compositeVolFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 16)] 
        public string priceOut { 
            get { 
                return this.priceOutField; 
            } 
            set { 
                this.priceOutField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 17)] 
        public decimal priceRange { 
            get { 
                return this.priceRangeField; 
            } 
            set { 
                this.priceRangeField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 18)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool priceRangeSpecified { 
            get { 
                return this.priceRangeFieldSpecified; 
            } 
            set { 
                this.priceRangeFieldSpecified = value; 
            } 
        } 

        /// <remarks/>

        [System.Xml.Serialization.XmlElement(Order = 19)] 
        public decimal priceStddev 
        { 
            get { 
                return this.priceStddevField; 
            } 
            set { 
                this.priceStddevField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 20)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool priceStddevSpecified { 
            get { 
                return this.priceStddevFieldSpecified; 
            } 
            set { 
                this.priceStddevFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 21)] 
        public string volOut { 
            get { 
                return this.volOutField; 
            } 
            set { 
                this.volOutField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 22)] 
        public decimal volRange { 
            get { 
                return this.volRangeField; 
            } 
            set { 
                this.volRangeField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 23)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool volRangeSpecified { 
            get { 
                return this.volRangeFieldSpecified; 
            } 
            set { 
                this.volRangeFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 24)] 
        public decimal volStddev { 
            get { 
                return this.volStddevField; 
            } 
            set { 
                this.volStddevField = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElement(Order = 25)] 
        [System.Xml.Serialization.XmlIgnoreAttribute()]        
        public bool volStddevSpecified { 
            get { 
                return this.volStddevFieldSpecified; 
            } 
            set { 
                this.volStddevFieldSpecified = value; 
            } 
        } 

        /// <remarks/> 
        [System.Xml.Serialization.XmlElementAttribute(DataType="integer", Order =26)]        
        public string contributors { 
            get { 
                return this.contributorsField; 
            } 
            set { 
                this.contributorsField = value; 
            } 
        } 
    }

最佳答案

我在实体类中的每个属性之上使用了 XmlElement[Order =n]。因此,在尝试了排序之后,我可以使此序列化工作。继承和部分类使此修复变得更加困难!谢谢。

关于c# - 以编程方式控制 xml 元素的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6759933/

相关文章:

c# - 如何防止 Visual Studio 2017 添加对 NugetFallbackFolder 的引用

c# - ASP.NET GridView - 控件在内容页面中移动

xml - 桌面应用程序中的 HTML 使用 iframe 加载页面

wcf - 如何配置自定义安全 token 处理程序?

c# - Winform 中的 TCP 连接

c# - c#中的内部类和公共(public)类有什么区别?

java - 检查设备是否有互联网连接

javascript - 为什么在终端中使用curl 调用时POST 工作在从I 调用时失败

c# - 从使用 WCF WebHttp API 实现的服务中的 POST 方法获取原始 xml

c# - 如何使 Windows 商店应用程序与 TLS 1.2 一起工作?