用于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();
}
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; } }
}