【问题标题】:XML Serializer and Deserializer class for different xml file用于不同 xml 文件的 XML 序列化器和反序列化器类
【发布时间】:2016-01-27 16:33:14
【问题描述】:

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

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 消息队列方案中使用。

谢谢, 比诺德

【问题讨论】:

    标签: c# xml serialization xml-serialization xml-deserialization


    【解决方案1】:

    您可以在transaction 中将message_string 设为动态。见下文:

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

    【讨论】:

    • 这是 MSMQ 的典型场景。我添加了将使用 xmlformatter 的类 MessageReceiver。请找到更新后的代码。我无法检查 xml 节点类型。
    • 也许其他人现在可能想帮助您。如果您在 original 问题本身中提供了适当的信息/背景,我就不会朝其他方向前进。
    【解决方案2】:

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

    [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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多