C# 使用嵌套列表解析xml

C# 使用嵌套列表解析xml,c#,xml,C#,Xml,我试图解析对象中的xml文件 这是我的xml文件Changelog.xml <?xml version="1.0" encoding="utf-8" ?> <Changelog> <Releases> <Release> <Version>1507</Version> <Date>22-11-2013</Date> <Changes>

我试图解析对象中的xml文件

这是我的xml文件Changelog.xml

<?xml version="1.0" encoding="utf-8" ?>
<Changelog>
  <Releases>
    <Release>
      <Version>1507</Version>
      <Date>22-11-2013</Date>
      <Changes>
        <Change>Change1</Change>
        <Change>Change2</Change>
        <Change>Change3</Change>
        <Change>Change4</Change>
      </Changes>
    </Release>
    <Release>
      <Version>1506</Version>
      <Date>20-11-2013</Date>
      <Changes>
        <Change>Change1</Change>
      </Changes>
    </Release>
  </Releases>
</Changelog>

1507
22-11-2013
变化1
变化2
变化3
变化4
1506
20-11-2013
变化1
这是我要将xml强制转换到的Changelog对象

[XmlRoot()]
public class Changelog
{
    private List<Release> releases;

    public List<Release> Releases
    {
        get { return releases; }
        set { releases = value; }
    }
}

public class Release
{
    private string version;
    private string date;
    private List<ChangeItem> changes;

    [XmlElement]
    public string Version
    {
        get { return version; }
        set { version = value; }
    }

    [XmlElement]
    public string Date
    {
        get { return date; }
        set { date = value; }
    }

    [XmlElement]
    public List<ChangeItem> Changes
    {
        get { return changes; }
        set { changes = value; }
    }
}

public class ChangeItem
{
    private string change;

    [XmlElement]
    public string Change
    {
        get { return change; }
        set { change = value; }
    }
}
[XmlRoot()]
公共类变更日志
{
私人名单发布;
公开名单发布
{
获取{return releases;}
设置{releases=value;}
}
}
公开课发行
{
私有字符串版本;
私有字符串日期;
私人名单变更;
[XmlElement]
公共字符串版本
{
获取{返回版本;}
设置{version=value;}
}
[XmlElement]
公共字符串日期
{
获取{返回日期;}
设置{date=value;}
}
[XmlElement]
公共列表更改
{
获取{返回更改;}
设置{changes=value;}
}
}
公共类变更项
{
私有字符串更改;
[XmlElement]
公共字符串更改
{
获取{返回更改;}
设置{change=value;}
}
}
我在这里读文件

XmlSerializer serializer = new XmlSerializer(typeof(Changelog));
Changelog changelog = (Changelog)serializer.Deserialize(new StreamReader(@"changelog.xml"));
Releases = changelog.Releases;

foreach (Release release in Releases)
{
    string version = release.Version;
    string date = release.Date;
    List<ChangeItem> changes = release.Changes; // Has only 1 item
}
XmlSerializer serializer=新的XmlSerializer(typeof(Changelog));
Changelog Changelog=(Changelog)序列化程序。反序列化(新的StreamReader(@“Changelog.xml”);
Releases=changelog.Releases;
foreach(发布中的发布)
{
字符串版本=release.version;
字符串日期=release.date;
List changes=release.changes;//只有1项
}
问题是变更列表中只有1个对象,尽管我预计1507版本会有4个


我做错了什么

您有一个ChangeItem.Change属性,该属性用
XmlElement
属性修饰。这意味着它将成为另一个元素

因此,xml需要看起来有所不同

要使其正常工作,请使用
[XmlText]
属性标记该属性

[XmlRoot]
public class Changelog
{
    private List releases;

    public List Releases
    {
        get { return releases; }
        set { releases = value; }
    }
}

public class Release
{
    private string version;
    private string date;
    private List changes;

    [XmlElement]
    public string Version
    {
        get { return version; }
        set { version = value; }
    }

    [XmlElement]
    public string Date
    {
        get { return date; }
        set { date = value; }
    }

    [XmlArray("Changes")]
    [XmlArrayItem("Change")]
    public List Changes
    {
        get { return changes; }
        set { changes = value; }
    }

}

public class ChangeItem
{
    private string change;

    [XmlText]
    public string Change
    {
        get { return change; }
        set { change = value; }
    }
}
另外,您的
Release.Changes
需要使用
XmlArray
XmlArrayItem
属性进行修饰

[XmlRoot]
public class Changelog
{
    private List releases;

    public List Releases
    {
        get { return releases; }
        set { releases = value; }
    }
}

public class Release
{
    private string version;
    private string date;
    private List changes;

    [XmlElement]
    public string Version
    {
        get { return version; }
        set { version = value; }
    }

    [XmlElement]
    public string Date
    {
        get { return date; }
        set { date = value; }
    }

    [XmlArray("Changes")]
    [XmlArrayItem("Change")]
    public List Changes
    {
        get { return changes; }
        set { changes = value; }
    }

}

public class ChangeItem
{
    private string change;

    [XmlText]
    public string Change
    {
        get { return change; }
        set { change = value; }
    }
}
[XmlRoot]
公共类变更日志
{
私人名单发布;
公开名单发布
{
获取{return releases;}
设置{releases=value;}
}
}
公开课发行
{
私有字符串版本;
私有字符串日期;
私人名单变更;
[XmlElement]
公共字符串版本
{
获取{返回版本;}
设置{version=value;}
}
[XmlElement]
公共字符串日期
{
获取{返回日期;}
设置{date=value;}
}
[XmlArray(“更改”)]
[XmlArrayItem(“更改”)]
公共列表更改
{
获取{返回更改;}
设置{changes=value;}
}
}
公共类变更项
{
私有字符串更改;
[XmlText]
公共字符串更改
{
获取{返回更改;}
设置{change=value;}
}
}
我用粗体标记了我的更改。

更改

[XmlElement]
public List<ChangeItem> Changes
{
    get { return changes; }
    set { changes = value; }
}
[XmlElement]
公共列表更改
{
获取{返回更改;}
设置{changes=value;}
}

[XmlArray(“更改”)]
公共列表更改
{
获取{返回更改;}
设置{changes=value;}
}

您忘记了
XmlArrayItemAttribute
XmlTextAttribute
。完整代码见我的答案。@SynerCoder是的,没有找到。您还需要注意,如果您试图在具有不同本地化设置的计算机上对日期格式进行反序列化,则可能会发现日期格式存在问题。如果可能,日期应为yyyy-MM-dd格式。没有问题,他将数据序列化为字符串。回避问题。