将CCTray内容XML反序列化为对象列表

时间:2017-03-21 12:57:15

标签: c# asp.net xml serialization xml-parsing

我正在尝试使用c#从我的构建服务器反序列化CCTray.xml的XML内容。

Tje XML内容有一个父“Projects”元素,下面是一个'Project'元素数组。每个项目元素都有多个属性。

我创建了一个Projects模型:

[XmlRoot("Projects")]
public class ProjectCollection
{
    public ProjectCollection() { Projects = new List<Project>(); }

    [XmlArray("Project")]
    public List<Project> Projects { get; set; }
}

每个项目的模型:

public class Project
{
    [XmlElement("Name")]
    public string Name { get; set; }

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

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

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

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

    [XmlElement("LastBuildTime")]
    public DateTimeOffset LastBuildTime { get; set; }
}

我尝试反序列化来自HttpClient的响应,如:

var xmlStream = await response.Content.ReadAsStreamAsync();
var serializer = new XmlSerializer(typeof(ProjectCollection));
var projects = (ProjectCollection)serializer.Deserialize(xmlStream);

其结果是一个空的ProjectCollection对象。

我知道我必须将XML映射到我的对象不正确,但我看不出它的错误。

返回的XML示例是:

<?xml version="1.0" encoding="utf-8"?>
<Projects>
    <Project name="Company.Project1.Api :: Build" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="1.0.0.203" lastBuildTime="2017-03-21T10:56:53" webUrl="http://build-company.com:8153/go/pipelines/Company.Project1.Api/203/Build/1" />
    <Project name="Company.Project2.Api :: Build :: Build" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="1.0.0.203" lastBuildTime="2017-03-21T10:56:53" webUrl="http://build-company.com:8153/go/tab/build/detail/Company.Project2.Api/203/Build/1/Build" />
</Projects>

我需要做什么才能正确地将此XML反序列化为我的对象?

由于

1 个答案:

答案 0 :(得分:0)

您的班级结构与您获得的数据不符。使用类结构,XML结构应该看起来不同。根需要另一个名为Project的元素。此元素包含您的项目。

<?xml version="1.0" encoding="utf-8"?>
<Projects>
    <Project>
        <Project name="Company.Project1.Api :: Build" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="1.0.0.203" lastBuildTime="2017-03-21T10:56:53" webUrl="http://build-company.com:8153/go/pipelines/Company.Project1.Api/203/Build/1" />
        <Project name="Company.Project2.Api :: Build :: Build" activity="Sleeping" lastBuildStatus="Success" lastBuildLabel="1.0.0.203" lastBuildTime="2017-03-21T10:56:53" webUrl="http://build-company.com:8153/go/tab/build/detail/Company.Project2.Api/203/Build/1/Build" />
    </Project>
</Projects>

要根据您的XML结构获取数据,请正确使用像

这样的简单根
[XmlRoot("Projects")]
public class ProjectCollection : List<Project>
{
}

此外,您还需要更新Project的所有属性。 XML Project没有任何元素,只有XML属性用于存储数据。这意味着您需要使用XmlAttribute而不是XmlElement。另请注意,名称区分大小写,在您的代码中也不正确。

[XmlAttribute("name")]
public string Name { get; set; }
//...