Xml Akna 服务序列化

Xml Serialization for Akna services

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

<main> 
    <emkt trans="20.05">
        <acao>[TITLE]</acao>
        <destinatario>
            <email>[EMAIL]</email
        </destinatario>
        <destinatario>
            <email>[EMAIL]</email
        </destinatario>
    </emkt>
 </main>

到目前为止我所做的是定义一个 class 并用 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();
}

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

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; } }
}