【问题标题】:XML to List<T> in MVC 4XML 到 MVC 4 中的 List<T>
【发布时间】:2012-10-31 10:42:02
【问题描述】:

我正在调用一个 web 服务,它返回带有学生的 XML。我需要将所有学生存储在我的数据库中(现有的学生表)。

现在我有一个获取 XML 的 XMLStudentParser 类,但是我不知道如何继续将每个学生记录存储到数据库中。我是否使用 XMLReader 循环遍历学生并将每个学生添加到 List&lt;Student&gt;,然后将该列表保存到数据库中?

通过网络服务远程 XML。

<Response>
  <Result>True</Result>
  <Table>
    <Students>
      <Student>
        <StudentID>14165</StudentID>
        <StudentName>Jeff Smith</StudentName>
        <GroupId>9109</GroupId>
      </Student>
      <Student>
        <StudentID>14168</StudentID>
        <StudentName>Mary Jones</StudentName>
        <GroupId>9109</GroupId>
      </Student>
    </Students>
  </Table>
</Response>

我的学生模型

public class Student
{
    public int StudentId { get; set; }
    public string FullName { get; set; }

    public int GrpId { get; set; }
}

最佳实践代码看起来如何:

  • 从网络服务获取 XML
  • 解析每个学生
  • 将每个学生存储在数据库中

【问题讨论】:

  • 您遗漏了有关 WebService 和数据库 API 的详细信息。这使得详细的答案变得困难。
  • 学生是否已经存在于数据库中?
  • 我基本上可以访问远程 XML 文件; 1个给家长,1个给学生,1个给他们在学校上的课。我需要定期在数据库中导入信息。 XML 可通过 http 调用访问。学生不会被手动添加,只是通过导入,所以我可以在必要时调整表格以适应导入——我只是不知道处理这个问题的正确方法(来自 RoR 背景)
  • 顺便说一句,我首先要导入父母,然后导入学生并通过 parentID 将他们链接到现有父母.. brr.

标签: c# sql xml asp.net-mvc-4


【解决方案1】:

正如之前的答案所述,通过添加 XML 元素属性使您的对象定义与 XML 匹配可能是反序列化 XML 的最简单方法:

[XmlElement]
public class Response
{
    [XmlElement]
    bool Result;
    public tbl[] Table;
}
public class tbl
{
    public Student[] Students;
}

public class Student
{
    public int StudentId { get; set; }
    public string FullName { get; set; }
    [XmlElement(ElementName = "GroupId")]    
    public int GrpId { get; set; }
}

然后,您可以将这些值插入到学生和家长的临时表中,并使用 SQL MERGE 语句更新您的主数据表。

【讨论】:

    【解决方案2】:

    如果您可以更改您的学生类属性以匹配 Xml 元素名称和/或使用指示哪些 XML 值转到哪些类属性的属性来装饰属性,那么您可以使用 .Net 将 XML 反序列化为一个学生列表一行。

    然后像往常一样坚持到数据库。

    Here's an example

    【讨论】:

      【解决方案3】:
      • XML 序列化为 StudentDTO 对象。
      • StudentDTO 到 Student 的映射。
      • 映射的学生将保存在数据库中。

      这里推荐使用 StudentDTO,因为您希望将 Student 类与来自 Web 的 XML 定义分离。如果 XML 定义发生变化,您只需更改 DTO 而不必更改 Student 实现。

      潜在的非生产代码:

      [XmlElement]
      public class StudentDTO 
      {
          [XmlElement]
          public string StudentName {get;set;}
      }
      
      [XmlElement]
      public class StudentsDTO : List<StudentDTO> 
      {
      }
      
      public class Student
      {
          public string Name {get;set;}
      }
      
      //Ideally on big System, Mapper class would be a generic on the lines of Mapper<Source,Target>
      //Mapper<StudentDTO,Student> and based on some rules it would do mapping.
      public class StudentDTOToStudentMapper
      {
          public Student GetStudentForDTO(StudentDTO dto)
          {
              //create object of student
              // Map corresponding property of StudentDTO to Student
              // e.g. StudentName to Name
          }
      }
      
      public class Client
      {
          public static void Main(DBHelper dbHandler, XMLSerialiser seriliaser, WebService serviceToCall,StudentDTOToStudentMapper mapper )
          {
              // XmlDocument/Object obj = serviceToCall.GetStudentsXML();
              // StudentsDTO students = Seriliaser.Deserialise(XML);
              // IEnumerable<Student> studentObjects = from eachDTO in students 
              //                   select mapper.GetStudentForDTO(eachDTO)
              // bool IsSaved = dbHandler.Save(students);
              // Based on IsSaved show the status.
          }   
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 2011-09-28
        • 2011-07-23
        相关资源
        最近更新 更多