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; } }
}
我们正在使用 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; } }
}