1

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

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

通过网络服务远程 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; }
}

最佳实践代码的外观如何:

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

3 回答 3

1

正如之前的答案所述,通过添加 XML Element 属性使您的对象定义与 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 语句更新您的主数据表。

于 2012-10-31T15:56:53.673 回答
0
  • 对 StudentDTO 对象的 XML 序列化。
  • StudentDTO 到学生的映射。
  • 映射的学生将保存在数据库中。

此处推荐使用 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.
    }   
}
于 2012-10-31T10:49:55.813 回答
0

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

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

这是一个例子

于 2012-10-31T10:47:04.573 回答