【问题标题】:Deserialize CCTray Content XML to list of objects将 CCTray 内容 XML 反序列化为对象列表
【发布时间】:2017-03-21 12:57:15
【问题描述】:

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

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

我创建了一个项目模型:

[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 反序列化为我的对象?

谢谢

【问题讨论】:

  • 使用RestSharp反序列化会更容易

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


【解决方案1】:

您的类结构不适合您获得的数据。对于您的类结构,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; }
//...

【讨论】:

  • 非常感谢,当场回答。为了完整起见,我还必须将 DatetimeOffset 更改为 DateTime
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2020-05-10
  • 1970-01-01
  • 2020-10-31
  • 2015-12-23
相关资源
最近更新 更多