【问题标题】:How can I turn an XML document into an easy to use C# object?如何将 XML 文档转换为易于使用的 C# 对象?
【发布时间】:2013-12-11 19:08:07
【问题描述】:

分布式项目“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

然后提取每个人唯一的密码from this page

既然这是一个很好的理由,我想鼓励其他人使用这个 API 并“竞争”以寻求治疗。

问题

如何获取这个 XML 文件并将其转换为消费用户可以轻松使用的 C# 类?

【问题讨论】:

标签: c# xml deserialization distributed-computing boinc


【解决方案1】:

您可以使用 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; }
}

【讨论】:

    【解决方案2】:

    我将它从 xml 转换为 json http://www.utilities-online.info/xmltojson/#.Uqi40eIa6So
    从 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; }
    }
    

    【讨论】:

      【解决方案3】:

      首先,我使用 xsd.exe 使用 XSD 架构从 xml 创建类。 (xsd.exe)。这将创建一个类。然后使用泛型:

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

      【讨论】:

        【解决方案4】:

        将 XML 复制到剪贴板,转到 C# 类文件,将光标放在要粘贴类的位置,然后转到 Edit->Paste Special->Paste XML as C# class,就完成了。

        【讨论】:

        • 呃,没有。那不存在。
        • 当然可以,至少在 VS2013 Ultimate 上是这样
        • 您可能需要安装插件或Json.net 才能看到它。编辑您的帖子以获取该信息,我将删除我的反对票。
        猜你喜欢
        • 1970-01-01
        • 2017-05-27
        • 2015-10-06
        • 2014-07-11
        • 2011-05-03
        • 2017-12-02
        • 2014-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多