2015-04-06 32 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