2012-10-31 43 views
1

我打電話web服務,這與學生返回XML列表 。我需要將所有學生存儲在我的數據庫(現有學生表)中。 XML在MVC 4

現在我有這個XMLStudentParser類獲得XML,但我在如何在每一個學生的記錄存儲到數據庫中繼續丟失。我是否使用XMLReader循環遍歷學生,並將每個學生添加到List<Student>,然後將該列表保存到數據庫中?通過Web服務

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

如何將最佳實踐代碼看看:

  • 獲取從WebService
  • 分析每個學生的XML
  • 存儲每個學生t
+0

你忽略了有關的WebService和數據庫的API的細節。這使得詳細的答案困難。 –

+0

學生可以在Db中存在嗎? –

+0

我基本上可以訪問遠程XML文件; 1爲父母,1爲學生,1爲他們在學校上課。我需要定期在數據庫中導入信息。 XML可以通過http-call訪問。學生不會手動添加,只需通過導入,所以我可以根據需要調整表格以適應導入 - 我只是不知道如何處理此問題的正確方法(來自RoR背景) –

回答

0

如果您可以更改您的學生類屬性以匹配Xml元素名稱和/或使用指示什麼是XML值屬性的屬性來修飾屬性,那麼您可以使用.Net將XML反序列化爲一行中的List Students。

然後,只需堅持到數據庫,你通常會。

Here's an example

0
  • XML序列化到一個StudentDTO對象。
  • StudentDTO to Student映射。
  • 映射學生被保存在數據庫中。

這裏推薦使用StudentDTO,因爲您希望將Student類從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. 
    } 
} 
+1

一些示例代碼的機會? –

+0

可能會在當天晚些時候 – NileshChauhan

+0

Ans編輯代碼。 – NileshChauhan

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語句更新主數據表。