2014-02-05 32 views
0

的我已经在XmlDocument的C#的对象,下面的XML下的节点#XML反序列化的childNodes到列表对象

<CR2CmdAck RequestID="DD477311-7129-4FE0-8E14-AC4AFA995DBC" ErrorCode="0"> 
     <CR2Rules> 
      <Rule RuleID="53" CallType="All" TargetType="All" DurationType="From" EffectiveFrom="2013-11-15" Tag="All targets, all calls, From" Status="Active"/> 
      <Rule RuleID="56" CallType="All" TargetType="All" DurationType="Calls" EffectiveFrom="2013-11-13" CallCount="2" Tag="All targets, all calls, 100 Calls" Status="Active"/> 
      <Rule RuleID="58" CallType="All" TargetType="Agent" DurationType="Calls" AgentID="1595" EffectiveFrom="2014-01-29" CallCount="10" Status="Active"/> 
      <Rule RuleID="59" CallType="All" TargetType="Agent" DurationType="From" AgentID="1595" EffectiveFrom="2014-01-29" Tag="" Status="Active"/> 
      <Rule RuleID="60" CallType="Inbound" TargetType="Agent" DurationType="Calls" AgentID="1615" EffectiveFrom="2014-01-29" CallCount="10" Status="Active"/> 
      <Rule RuleID="61" CallType="All" TargetType="Agent" DurationType="Calls" AgentID="9954" EffectiveFrom="2014-01-29" CallCount="10" Tag="" Status="Active"/> 
      <Rule RuleID="62" CallType="All" TargetType="AgentQ" DurationType="Calls" QueueID="247" EffectiveFrom="2014-01-29" CallCount="10" Tag="" Status="Active"/> 
      <Rule RuleID="63" CallType="Inbound" TargetType="Agent" DurationType="Between" AgentID="2161" EffectiveFrom="2014-01-29" EffectiveTo="2014-02-05" Tag="" Status="Active"/> 
     </CR2Rules> 
    </CR2CmdAck> 

我想这个XML序列化到C#对象

的类如下

[DataContract] 
[Serializable] 
[XmlInclude(typeof(SavedRule))] 
public class Rule 
{ 
    [DataMember] 
    [XmlElement("TargetType")] 
    public virtual string TargetType { get; set; } 

    [DataMember] 
    [XmlElement("CallType")] 
    public string CallType { get; set; } 

    [DataMember] 
    [XmlElement("EffectiveFrom")] 
    public DateTime EffectiveFrom { get; set; } 

    [DataMember] 
    [XmlElement(ElementName = "EffectiveTo", IsNullable = true)] 
    public DateTime? EffectiveTo { get; set; } 

    [DataMember] 
    [XmlElement(ElementName = "CallCount", IsNullable = true)] 
    public int? CallCount { get; set; } 

    [DataMember] 
    [XmlElement("Tag")] 
    public string Tag { get; set; } 
} 

[XmlRoot("Rule")] 
[Serializable] 
public class SavedRule : Rule 
{ 
    private string _targetType; 

    [XmlElement("RuleID")] 
    public int ID { get; set; } 

    [XmlChoiceIdentifier("TargetIDName")] 
    [XmlElement(ElementName = "AgentID", IsNullable = true), XmlElement(ElementName = "QueueID", IsNullable = true)] 
    public int? TargetID { get; set; } 

    [XmlElement("Status")] 
    public string Status { get; set; } 

    [XmlIgnore] public TargetIDNameSelector TargetIDName; 

    public override string TargetType 
    { 
     get { return _targetType; } 
     set 
     { 
      _targetType = value; 
      switch (_targetType) 
      { 
       case "Agent": 
       { 
        TargetIDName = TargetIDNameSelector.AgentID; 
       } 
        break; 
       case "AnonQ": 
       case "AgentQ": 
       { 
        TargetIDName = TargetIDNameSelector.QueueID; 
       } 
        break; 
       default: 
       { 
        TargetIDName = TargetIDNameSelector.None; 
       } 
        break; 
      } 
     } 
    } 
} 

public enum TargetIDNameSelector 
{ 
    None, 
    AgentID, 
    QueueID 
} 

请告诉我如何反序列化作者<CR2Rules>节点的内容来List<SavedRule>

在此先感谢

+1

为什么这么喊? –

+0

只是给予一些重要 – geekbytes0xff

回答

0

如何使用LINQ to XML

var rules = XDocument.Load(filename) 
      .Descendants("Rule") 
      .Select(x => x.Attributes().ToDictionary(e => e.Name, e => e.Value)) 
      .ToList(); 

foreach(var rule in rules) 
{ 
    Console.WriteLine(rule["EffectiveFrom"]); 
} 

OR

var rules = XDocument.Load(filename) 
       .Descendants("Rule") 
       .Select(r => new SavedRule 
       { 
        CallType = (string)r.Attribute("CallType"), 
        EffectiveFrom = (DateTime)r.Attribute("EffectiveFrom"), 
        EffectiveTo = (DateTime?)r.Attribute("EffectiveTo"), 
        ID = (int)r.Attribute("RuleID"), 
        Status = (string)r.Attribute("Status"), 
        TargetID = (int?)r.Attribute("TargetID"), 
        TargetType = (string)r.Attribute("TargetType"), 
        CallCount = (int?)r.Attribute("CallCount"), 
        Tag = (string)r.Attribute("Tag") 
       }) 
       .ToList(); 
+0

感谢那 但我需要反序列化到列表 geekbytes0xff

+0

@ geekbytes0xff你仍然可以用Linq2Xml做到这一点。查看编辑。 – EZI

+0

感谢QtX,但我正在寻找的是使用.net的默认XML序列化程序,它使用我已添加类属性 – geekbytes0xff