用于Akna服务的Xml序列化

本文关键字:Xml 序列化 服务 Akna 用于 | 更新日期: 2023-09-27 17:50:28

我们正在使用Akna服务为客户发送电子邮件营销。这些电子邮件是通过向Akna服务发布xml发送的。基本的xml结构是:

<main> 
    <emkt trans="20.05">
        <acao>[TITLE]</acao>
        <destinatario>
            <email>[EMAIL]</email
        </destinatario>
        <destinatario>
            <email>[EMAIL]</email
        </destinatario>
    </emkt>
 </main>
到目前为止,我所做的是定义一个类并用Xml属性装饰它。然而,我不知道如何总是在main标签之后插入标签emkt并将所有内容封装在其中。
public class Destinatario
{
    [XmlElement("email")]
    public string Email { get; set; }
}
[XmlRoot("main")]
public class ContatoComAcaoPreDefinidaAgendamento
{
    [XmlElement("acao")]
    public string Acao { get; set; }
    [XmlElement("destinatario")]
    public List<Destinatario> Destinatarios { get; set; }        
}

要序列化,我使用下面的方法

public static string ToXml<T>(this T target) where T : class
{
    var x = new XmlSerializer(target.GetType());
    var textWriter = new StringWriter();
    var ns = new XmlSerializerNamespaces();
    ns.Add("", "");
    x.Serialize(textWriter, target, ns);
    return textWriter.ToString();
}

用于Akna服务的Xml序列化

XmlSerializer将您的类层次结构序列化为XML元素层次结构。因此,需要在ContatoComAcaoPreDefinidaAgendamento中包含一个可以映射到emkt元素的中间类。但是,如果方便的话,您可以在顶级类中使用代理属性来隐藏这个中间类的存在,直接获取和设置它的属性:

public class Destinatario
{
    [XmlElement("email")]
    public string Email { get; set; }
}
public class Emkt
{
    public Emkt()
    {
        Trans = "20.05";
    }
    [XmlAttribute("trans")]
    public string Trans { get; set; }
    [XmlElement("acao")]
    public string Acao { get; set; }
    [XmlElement("destinatario")]
    public List<Destinatario> Destinatarios { get; set; }
}
[XmlRoot("main")]
public class ContatoComAcaoPreDefinidaAgendamento
{
    Emkt emkt;
    [XmlElement("emkt")]
    public Emkt Emkt
    {
        get
        {
            // Auto-allocate.
            if (emkt == null)
                Interlocked.CompareExchange(ref emkt, new Emkt(), null);
            return emkt;
        }
        set
        {
            emkt = value;
        }
    }
    [XmlIgnore]
    public string Acao { get { return Emkt.Acao; } set { Emkt.Acao = value; } }
    [XmlIgnore]
    public List<Destinatario> Destinatarios { get { return Emkt.Destinatarios; } set { Emkt.Destinatarios = value; } }
}