簡體   English   中英

將XML文檔反序列化為實現IEnumerable / IEnumerable的對象<T>

[英]Deserialize XML document to object implementing IEnumerable / IEnumerable<T>

我有一個像這樣的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<UserData>
    <Users>
        <User>
            <Name>TestName1</Name>
            <Password>Password1</Password>
            <Level>1</Level>
        </User>
        <User>
            <Name>TestName2</Name>
            <Password>PAssword2</Password>
            <Level>2</Level>
        </User>
    </Users>
</UserData>

基於該XML結構,我使用以下兩個類對其進行反序列化:

[Serializable()]
public sealed class User
{
    [System.Xml.Serialization.XmlElement("Name")]
    public string Name { get; set; }

    [System.Xml.Serialization.XmlElement("Password")]
    public string Password { get; set; }

    [System.Xml.Serialization.XmlElement("Level")]
    public string Level { get; set; }
}

[System.Xml.Serialization.XmlRoot("UserData")]
public class UserData
{
    [XmlArray("Users")]
    [XmlArrayItem("User", typeof(User))]
    public User[] Users { get; set; }
}

反序列化的實現如下所示:

private void ParseXMLCfg()
{
    StreamReader reader = new StreamReader(_cfgFileDir);
    try
    {
        XmlSerializer serializer = new XmlSerializer(typeof(UserData));
        _users = (UserData)serializer.Deserialize(reader);
    }
    catch (InvalidOperationException e)
    {
        _logger.DebugFormat("{0}", e);
    }

    reader.Close();

   }

到目前為止一切正常。 但是我的問題是我的類沒有實現IEnumerable。 所以我不能使用foreach遍歷數組。 如何對我的UserData類實現IEnumerable?

我的方法之一是這樣的:

   [System.Xml.Serialization.XmlRoot("UserData")]
    public class UserData:IEnumerable
    {
        [XmlArray("Users")]
        [XmlArrayItem("User", typeof(User))]
        public User[] Users { get; set; }

        // IEnumerable Member
        public IEnumerator GetEnumerator()
        {
            foreach (object o in Users)
            {
                if(o == null)
                {
                    break;
                }
                yield return o;
            }
        }
    }

但這行不通。

為此類實現IEnumerable的方法是什么? 還有一種實現IEnumerable的方法,因為最后我想反序列化為List而不是用戶數組。

Users[]已經實現了IEnumerable ,因此您不必自己進行實現。 只需調用基礎對象之一:

// IEnumerable Member
public IEnumerator GetEnumerator()
{
    return Users.GetEnumerator();
}

當您使用它時,最好實現IEnumerable的通用版本:

[System.Xml.Serialization.XmlRoot("UserData")]
public class UserData : IEnumerable<User>
{
    [XmlArray("Users")]
    [XmlArrayItem("User", typeof(User))]
    public User[] Users { get; set; }

    // IEnumerable Member
    public IEnumerator GetEnumerator()
    {
        return this.Users.GetEnumerator();
    }

    IEnumerator<User> IEnumerable<User>.GetEnumerator()
    {
        return ((IEnumerable<User>)this.Users).GetEnumerator();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM