2015-10-28 96 views
0

我有2种不同格式的需要使用C#序列化和反序列化的xml文件。用于不同xml文件的XML序列化器和反序列化器类

XML文件 类型1:

<?xml version="1.0"?> 
<tms_msg> 
    <transaction> 
     <message_string>Left Over</message_string> 
    </transaction> 
</tms_msg> 

类型2:

<?xml version="1.0"?> 
<tms_msg> 
    <transaction> 
     <message_string> 
      <utc_date_time>0001-01-01T00:00:00</utc_date_time> 
      <utctime>000000</utctime> 
      <latitude/> 
      <latitude_hemi/> 
      <longitude/> 
      <longitude_hemi/> 
      <speed/> 
      <heading>000</heading> 
     </message_string> 
    </transaction> 
</tms_msg> 

哪能序列化和反序列化两个不同的XML文件? 我需要一个可以对这些xml文件进行序列化和反序列化的类。

//更新的代码

public class MessageReceiver 
{ 
    private MessageQueue _queue; 
    private readonly string _queueName; 

    public MessageReceiver() 
    { 
     this._queueName = @".\Private$\to_dispatch"; 
    } 

    public void StartRead() 
    { 
     _queue = new MessageQueue(_queueName); 
     _queue.PeekCompleted += QueuePeekCompleted; 

    } 

    private void QueuePeekCompleted(object sender, PeekCompletedEventArgs e) 
    { 
     var message = _queue.EndPeek(e.AsyncResult);   
     message.Formatter = new XmlMessageFormatter(new Type[] { typeof(tms_msg) }); 
     Console.WriteLine(string.Format("The message was: {0}", message.Id)); 
     var m = message.Body;    
     Console.WriteLine(string.Format("The QueuePeek is completed message was: {0}", message.Id));  
    } 

    public override string ToString() 
    { 
     return _queueName; 
    } 
} 

我使用的MSMQ消息队列的情况。

感谢, Binod

回答

1

您可以message_stringtransaction动态。请看下图:

[XmlRoot("tms_msg")] 
public class TmsMsg 
{ 
    [XmlElement("transaction")] 
    public Transaction Transaction { get; set; } 
} 

public class Transaction 
{ 
    [XmlElement("message_string")] 
    public dynamic MessageString { get; set; } 
} 

反序列化:

public void Deserialize() 
{ 
    TmsMsg msg = null; 
    var msgDict = new Dictionary<string, string>(); 

    using (var stream = new FileStream("Type2.xml", FileMode.Open)) 
    { 
     XmlSerializer ser = new XmlSerializer(typeof(TmsMsg)); 
     msg = ser.Deserialize(stream) as TmsMsg; 
    } 

    // type 1 : message_string element has a xml text node 
    // type 2 : message_string element has a xml elements 
    foreach (var node in msg.Transaction.MessageString) 
    { 
     if (node.NodeType == XmlNodeType.Text) 
     { 
      msgDict.Add("message_string", node.Value); 
     } 
     else if (node.NodeType == XmlNodeType.Element) 
     { 
      msgDict.Add(node.Name, node.InnerText); 
     } 
    } 
} 
+0

这是MSMQ的典型场景。我添加了要使用xmlformatter的类MessageReceiver。请找到更新的代码。我无法检查xml节点类型。 – Binod

+0

也许别人可能想要现在帮你。如果您在*原创*问题本身提供了适当的信息/背景,我不会在其他方面进行。 – niksofteng

0

我找到了答案,这是工作。 在上面的代码中更改以下内容。

[XmlElement("message_string")] 
public dynamic message_string{ get; set; } 

[XmlElement(typeof(string)), XmlElement(typeof(message_string))] 
public dynamic message_string{ get; set; } 

,并更改类名Message_String到message_string。