Как я могу превратить документ XML в простой в использовании объект C#?

Распределенный проект "World Community Grid" имеет возможность получать подробную информацию о пользователях, такую ​​как:

<?xml version="1.0" encoding="UTF-8"?>

<MemberStatsWithTeamHistory>
    <MemberStats>
   <MemberStat>
      <Name>makerofthings7</Name>
      <MemberId>876300</MemberId>
      <TeamId>0QGNJ4D832</TeamId>
      <RegisterDate>2013-12-08</RegisterDate>
      <LastResult>2013-12-11T11:58:51</LastResult>
      <NumDevices>4</NumDevices>
      <StatisticsTotals>
         <RunTime>1290126</RunTime>
         <RunTimeRank>415174</RunTimeRank>
         <Points>61710</Points>
         <PointsRank>293387</PointsRank>
         <Results>175</Results>
         <ResultsRank>282858</ResultsRank>
      </StatisticsTotals>
      <StatisticsAverages>
         <RunTimePerDay>322532</RunTimePerDay>
         <RunTimePerResult>7372</RunTimePerResult>
         <PointsPerHourRunTime>172.19713423320002</PointsPerHourRunTime>
         <PointsPerDay>15427.5</PointsPerDay>
         <PointsPerResult>352.62857142857104</PointsPerResult>
         <ResultsPerDay>43.75</ResultsPerDay>
      </StatisticsAverages>
      <Resource>
         <Url>http://www.worldcommunitygrid.org/stat/viewMemberInfo.do?userName=makerofthings7&amp;xml=true</Url>
         <Description>makerofthings7</Description>
      </Resource>
   </MemberStat>
</MemberStats>
    <TeamHistory>
   <Team>
      <Name>Ripple Labs</Name>
      <TeamId>0QGNJ4D832                          </TeamId>
      <JoinDate>2013-12-08</JoinDate>
      <StatisticsTotals>
         <RunTime>688331</RunTime>
         <Points>33548</Points>
         <Results>99</Results>
      </StatisticsTotals>
   </Team>
    </TeamHistory>
   <MemberStatsByProjects>
      <Project>         <ProjectName>Mapping Cancer Markers</ProjectName>
         <ProjectShortName>mcm1</ProjectShortName>
         <RunTime>518163</RunTime>
         <Points>22918</Points>
         <Results>39</Results>
      </Project>      <Project>         <ProjectName>The Clean Energy Project - Phase 2</ProjectName>
         <ProjectShortName>cep2</ProjectShortName>
         <RunTime>61555</RunTime>
         <Points>3422</Points>
         <Results>4</Results>
      </Project>      <Project>         <ProjectName>FightAIDS@Home</ProjectName>
         <ProjectShortName>faah</ProjectShortName>
         <RunTime>710408</RunTime>
         <Points>35370</Points>
         <Results>132</Results>
      </Project>   </MemberStatsByProjects>
</MemberStatsWithTeamHistory>

Я смог получить этот XML, перейдя сюда:

 http://www.worldcommunitygrid.org/verifyMember.do?name=makerofthings7&code=SECRET CODE HERE

Затем извлечение секретного кода с этой страницы, который является уникальным для каждого человека.

Поскольку это очень хорошее дело, я хочу призвать других людей использовать этот API и "побороться" за лекарство.

Вопрос

Как я могу взять этот XML-файл и преобразовать его в класс C#, который может легко использоваться потребляющими пользователями?

4 ответа

Вы можете использовать XmlSerialzier....

XmlSerializer serializer = new XmlSerializer(typeof(MemberStatsWithTeamHistory));
var obj = serializer.Deserialize(File.OpenRead(fname)) as MemberStatsWithTeamHistory;

PS: Это не то же самое, что ответ @AydinAdn. Я изменил, например, определение MemberStatsByProjects, чтобы оно работало


public class StatisticsTotals
{
    public string RunTime { get; set; }
    public string RunTimeRank { get; set; }
    public string Points { get; set; }
    public string PointsRank { get; set; }
    public string Results { get; set; }
    public string ResultsRank { get; set; }
}

public class StatisticsAverages
{
    public string RunTimePerDay { get; set; }
    public string RunTimePerResult { get; set; }
    public string PointsPerHourRunTime { get; set; }
    public string PointsPerDay { get; set; }
    public string PointsPerResult { get; set; }
    public string ResultsPerDay { get; set; }
}

public class Resource
{
    public string Url { get; set; }
    public string Description { get; set; }
}

public class MemberStat
{
    public string Name { get; set; }
    public string MemberId { get; set; }
    public string TeamId { get; set; }
    public string RegisterDate { get; set; }
    public string LastResult { get; set; }
    public string NumDevices { get; set; }
    public StatisticsTotals StatisticsTotals { get; set; }
    public StatisticsAverages StatisticsAverages { get; set; }
    public Resource Resource { get; set; }
}

public class MemberStats
{
    public MemberStat MemberStat { get; set; }
}

public class StatisticsTotals2
{
    public string RunTime { get; set; }
    public string Points { get; set; }
    public string Results { get; set; }
}

public class Team
{
    public string Name { get; set; }
    public string TeamId { get; set; }
    public string JoinDate { get; set; }
    public StatisticsTotals2 StatisticsTotals { get; set; }
}

public class TeamHistory
{
    public Team Team { get; set; }
}

public class Project
{
    public string ProjectName { get; set; }
    public string ProjectShortName { get; set; }
    public string RunTime { get; set; }
    public string Points { get; set; }
    public string Results { get; set; }
}

public class MemberStatsWithTeamHistory
{
    public MemberStats MemberStats { get; set; }
    public TeamHistory TeamHistory { get; set; }
    public List<Project> MemberStatsByProjects { get; set; }
}

Я преобразовал его из XML в JSON http://www.utilities-online.info/xmltojson/
И от json до csharp: http://json2csharp.com/
Надеюсь, это поможет:)

public class StatisticsTotals
{
    public string RunTime { get; set; }
    public string RunTimeRank { get; set; }
    public string Points { get; set; }
    public string PointsRank { get; set; }
    public string Results { get; set; }
    public string ResultsRank { get; set; }
}

public class StatisticsAverages
{
    public string RunTimePerDay { get; set; }
    public string RunTimePerResult { get; set; }
    public string PointsPerHourRunTime { get; set; }
    public string PointsPerDay { get; set; }
    public string PointsPerResult { get; set; }
    public string ResultsPerDay { get; set; }
}

public class Resource
{
    public string Url { get; set; }
    public string Description { get; set; }
}

public class MemberStat
{
    public string Name { get; set; }
    public string MemberId { get; set; }
    public string TeamId { get; set; }
    public string RegisterDate { get; set; }
    public string LastResult { get; set; }
    public string NumDevices { get; set; }
    public StatisticsTotals StatisticsTotals { get; set; }
    public StatisticsAverages StatisticsAverages { get; set; }
    public Resource Resource { get; set; }
}

public class MemberStats
{
    public MemberStat MemberStat { get; set; }
}

public class StatisticsTotals2
{
    public string RunTime { get; set; }
    public string Points { get; set; }
    public string Results { get; set; }
}

public class Team
{
    public string Name { get; set; }
    public string TeamId { get; set; }
    public string JoinDate { get; set; }
    public StatisticsTotals2 StatisticsTotals { get; set; }
}

public class TeamHistory
{
    public Team Team { get; set; }
}

public class Project
{
    public string ProjectName { get; set; }
    public string ProjectShortName { get; set; }
    public string RunTime { get; set; }
    public string Points { get; set; }
    public string Results { get; set; }
}

public class MemberStatsByProjects
{
    public List<Project> Project { get; set; }
}

public class MemberStatsWithTeamHistory
{
    public MemberStats MemberStats { get; set; }
    public TeamHistory TeamHistory { get; set; }
    public MemberStatsByProjects MemberStatsByProjects { get; set; }
}

public class RootObject
{
    public MemberStatsWithTeamHistory MemberStatsWithTeamHistory { get; set; }
}

Сначала я использую xsd.exe для создания классов из xml, используя схему XSD. ( xsd.exe). Это создаст класс. Тогда используйте Generics:

public class XmlSerializer<T>
    {
        /// <summary>
        /// Load a Xml File and Deserialize into and object         
        /// </summary>
        /// <param name="xml">Xml String</param>
        /// <returns>Object representing the xml. You should catch an InvalidCastException</returns>
        public T DeserializeXmlProductContent(String xml)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));

            T obj;
            using (StringReader reader = new StringReader(xml))
            {
                obj = (T)serializer.Deserialize(reader);
            }
            return obj;


        }
        /// <summary>
        /// Serialize an Object to a Xml String
        /// </summary>
        /// <param name="obj">Any Object</param>
        /// <returns>Xml String</returns>
        public String SerializeProductContentToXml(T obj)
        {

            XmlSerializer serializer = new XmlSerializer(obj.GetType());

            using (StringWriter writer = new StringWriter())
            {
                serializer.Serialize(writer, obj);

                return writer.ToString();
            }

        }
    }

Скопируйте XML в буфер обмена, перейдите в файл класса C#, поместите курсор туда, куда вы хотите вставить классы, а затем перейдите в Edit->Paste Special->Paste XML as C# class, и все готово.

Другие вопросы по тегам