2015-04-06 34 views
1

我有一個商家的帳戶餘額請求類,如下所示:XML序列化,其中請求元件被包裹起來具有多個父元素

[Serializable] 
[XmlRoot(ElementName = "accountbalance", Namespace = "", IsNullable = false)] 
public class MerchantAccountBalanceRequest 
{ 
    [XmlElementAttribute("agent")] 
    public string Agent { get; set; } 
    [XmlElementAttribute("agentPin")] 
    public string AgentPin { get; set; } 
} 

,這將導致在下面的XML:

<accountbalance> 
    <agent>aaaaaa</agent> 
    <agentPin>mmmmmm</agentPin> 
</accountbalance> 

莫非我以某種方式在我的課上放置一個屬性,以便對於MerchantAccountBalanceRequest對象,我將獲得以下XML:

<Envelope> 
<Body> 
<accountbalance> 
    <agent>aaaaaa</agent> 
    <agentPin>mmmmmm</agentPin> 
</accountbalance> 
</Body> 
</Envelope> 

也就是說,只是用EnvelopeBody元素來包裝它。

回答

1

雖然你不能用你的請求類的屬性做到這一點,你可以用其他類佔EnvelopeBody元素你的要求了:

public class MerchantAccountBalanceRequest 
{ 
    [XmlElement("agent")] 
    public string Agent { get; set; } 
    [XmlElement("agentPin")] 
    public string AgentPin { get; set; } 
} 

public class RequestBody 
{ 
    [XmlElement("accountbalance")] 
    public MerchantAccountBalanceRequest BalanceRequest { get; set; } 
} 

[XmlRoot(ElementName = "Envelope")] 
public class RequestEnvelope 
{ 
    [XmlElement("Body")] 
    public RequestBody Body { get; set; } 
} 

當序列化和反序列化,構建您的XmlSerializerRequestEnvelope而不是MerchantAccountBalanceRequest的對象。在構建時,您必須設置RequestEnvelope.BodyRequestBody.BalanceRequest屬性(爲了方便起見,您可能需要將RequestEnvelope中的Body屬性初始化爲構造函數中的新實例RequestBody實例)。

這看起來像在一些協議的單個請求類型,因此,如果有多個請求類型,可以創建一個基類爲請求(例如RequestBase),並調整RequestBody使得它接受的一個選擇可能的請求元素,如下例所示:

public abstract class RequestBase 
{ 
} 

public class SomeOtherRequest : RequestBase 
{ 
    [XmlElementAttribute("example")] 
    public string Example { get; set; } 
} 

public class MerchantAccountBalanceRequest : RequestBase 
{ 
    [XmlElement("agent")] 
    public string Agent { get; set; } 
    [XmlElement("agentPin")] 
    public string AgentPin { get; set; } 
} 

public class RequestBody 
{ 
    [XmlElement(ElementName = "accountbalance", Type = typeof(MerchantAccountBalanceRequest))] 
    [XmlElement(ElementName = "somethingelse", Type = typeof(SomeOtherRequest))] 
    public RequestBase Request { get; set; } 
} 
+0

我在考慮繼承,但忘記了抽象類。非常感謝大衛 – 2015-04-06 13:33:48

+1

沒問題:-)但你怎麼知道我的名字:-o – softwariness 2015-04-06 13:45:56

+0

https://www.softwariness.com/contact/親切的問候,大衛 :) – 2015-04-07 04:56:52