我正在尝试使用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反序列化为我的对象?
由于
答案 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; }
//...