【问题标题】:Deserialize XML into Entitylist using C# from XMLdocument使用 XMLdocument 中的 C# 将 XML 反序列化为 Entitylist
【发布时间】:2015-07-23 13:39:02
【问题描述】:

将以下具有多个事件节点的 XML 文件引用到父事件标记中

<events>
<event eventid="ahjy67kl" sessionid="1">
<eventtitle>
<![CDATA[ phoneEventchad_1 ]]>
</eventtitle>
<eventabstract/>
<timezone>IND</timezone>
<eventtimedate>Wed, 24 Jun 2015 06:00 PDT</eventtimedate>
<archivestartdate>Wed, 24 Jun 2015 09:30 PDT</archivestartdate>
<archiveenddate>Thu, 23 Jun 2016 09:30 PDT</archiveenddate>
<length>195</length>
<sponsor/>
<keywords/>
<location/>
<eventprofile>
<![CDATA[ Stonehenge Profile (918) ]]>
</eventprofile>
<streamtype>
<![CDATA[ whitepaper ]]>
</streamtype>
<categories/>
<eventstdfield1>
<value/>
</eventstdfield1>
<eventstdfield2/>
<eventstdfield3/>
<eventstdfield4/>
<eventstdfield5/>
<audiencekeylock>
<![CDATA[ 770D14C9CC784E9D9D312563B093E9A5 ]]>
</audiencekey>
<urls>
<audienceurl>
<![CDATA[
http://event.on24.com/wcc/r/1012538/770D14C9CC784E9D9D312563B093E9A5&partnerref=rss-scribev3
]]>
</audienceurl>
<extaudienceurl/>
<reporturl>
<![CDATA[ ##REPORT_URL## ]]>
</reporturl>
<uploadurl>
<![CDATA[ ##UPLOAD_URL## ]]>
</uploadurl>
<presenterurl>
<![CDATA[ ##PRESENTER_URL## ]]>
</presenterurl>
</urls>
<speakers/>
<registrationstats>
<registrantcount>0</registrantcount>
</registrationstats>
<attendancestats>
<attendedcount>0</attendedcount>
<noshowcount>0</noshowcount>
<attendedlivecount>0</attendedlivecount>
<attendedarchivecount>0</attendedarchivecount>
</attendancestats>
<partnerrefstats/>
<tags/>
<registrants></registrants>
<attendees></attendees>
</event>
</events>

"

实体类

public class events
{
    private Event _event;

    [XmlElement(ElementName = "event")] 
    public Event Event
    {
        get
        {
            return this._event;
        }
        set
        {
            this._event = value;
        }
    }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class Event
{
    public string eventid { get; set; }
    public string sessionid { get; set; }
    public string eventTitle { get; set; }      
    public DateTime archivestartdate { get; set; }
    public DateTime archiveenddate { get; set; }
    public string eventabstract { get; set; }
    public DateTime eventtimedate { get; set; }
    public string eventprofile { get; set; }
    public string registrantcount { get; set; }
    public string sponsor { get; set; }
    public string keywords { get; set; }
    public string eventstdfield1 { get; set; }
    public string eventstdfield2 { get; set; }
    public string eventstdfield3 { get; set; }
    public string eventstdfield4 { get; set; }
    public string eventstdfield5 { get; set; }
    public attendancestats attendancestats { get; set; }
    public registrationstats registrationstats { get; set; }

    public Event()
    { }
}

public class attendancestats
{
    public string attendedcount { get; set; }
    public string noshowcount { get; set; }
    public string attendedlivecount { get; set; }
    public string attendedarchivecount { get; set; }       

}
public class registrationstats
{
    public string registrantcount { get; set; } 
}

我使用下面的代码将提到的 XML 反序列化到上面的实体类中

pDoc是上面xml填充的XMLdocument的对象

System.Xml.Serialization.XmlRootAttribute xRoot = new System.Xml.Serialization.XmlRootAttribute(); xRoot.ElementName = "事件"; xRoot.IsNullable = true;

        System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(List<events>),xRoot);
        XDocument Doc = new XDocument();
        Doc = XDocument.Parse(pDoc.OuterXml);
        //System.Xml.XmlReader reader = Doc.CreateReader();
        XmlReader reader = XmlReader.Create(new System.IO.StringReader(Doc.ToString()));
        List<Event> result = (List<Event>)serializer.Deserialize(reader);
        reader.Close();

在上面的代码阅读器对象中,由于 List 的哪个结果对象抛出异常,因此为 null。

我想要事件列表。

请帮我实现事件列表。如果需要提供更多详细信息,请告诉我。

【问题讨论】:

    标签: c# xml serialization deserialization


    【解决方案1】:

    我真的不明白这是如何工作的。您的 Event 类似乎只有一个事件,XML 文件包含许多事件。试试这个:

    [Serializable]
    [XmlRoot(ElementName = "events")]
    public class Events {
    
       public Events()
       {
        EventList = new List<Event>();
       }
       [XmlElement(ElementName="event")]
       List<Event> EventList {get; set;}
    }
    
    [Serializable]
    public class Event {
      [XmlAttribute("eventid")
      public string eventid {get; set;}
        .......
    
     [XmlElement(ElementName="timezone")]
      public string timezone {get; set;}
    }
    

    很明显,您需要对每个可用属性都这样做。现在,反序列化:

            string input = System.IO.File.ReadAllText(PATH_TO_YOUR_XML_FILE); //this can be replaced with any func giving string
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Events));
            var doc = XDocument.Parse(input);
            using (var reader = doc.Root.CreateReader())
            {
                return (Events)xmlSerializer.Deserialize(reader);
            }
    

    好的,这将产生Events类,在EventList中有List。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多