2017-03-21 138 views
0

我正嘗試從c#構建服務器反序列化CCTray.xml的XML內容。將CCTray內容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到我的對象?

謝謝

+0

使用RestSharp它會更容易反序列化 –

回答

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; } 
//... 
+0

非常感謝,點答案。爲了完整起見,我還必須將DatetimeOffset更改爲DateTime – Chris