简体   繁体   中英

How can I turn an XML document into an easy to use C# object?

The Distributed project "World Community Grid" has the ability to get detailed user information such as:

<?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>

I was able to get this XML by going here:

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

Then extracting the secret code from this page which is unique on a per person basis.

Since this is such a good cause, I want to encourage other people to use this API and "compete" for a cure.

Question

How can I take this XML file and convert it into a C# class that can easily be used by consuming users?

You can use XmlSerialzier....

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

PS: It is not the same as @AydinAdn's answer. I changed, for example, MemberStatsByProjects definition to make it work


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; }
}

I converted it from xml to json http://www.utilities-online.info/xmltojson/#.Uqi40eIa6So
And from json to csharp: http://json2csharp.com/
Hope that helps :)

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; }
}

First I use xsd.exe to create the classes from the xml using an schema XSD. ( xsd.exe ). This will create a class. Then use 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#类文件,将光标放在要粘贴类的位置,然后转到“编辑”->“粘贴特殊”->“将XML粘贴为C#类”,就完成了。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM