C# 将远程XML文件导入MVC4WebApp

C# 将远程XML文件导入MVC4WebApp,c#,xml,entity-framework,asp.net-mvc-4,C#,Xml,Entity Framework,Asp.net Mvc 4,我有一个webapp,每天晚上需要导入3个不同的远程XML文件。这些文件包含学生和家长信息、学习信息等 有人能告诉我如何读取XML(通过http),然后在每个学生身上循环,这样我就可以从其他XML文件中添加信息,并将关系存储到我的数据库中吗 需要一些示例代码,如: 打开并读取父XML,并使用XML文件中的固定ID存储在数据库中 打开并读取学生XML并存储在数据库中,并使用父XML中的父id链接到各自的父XML 还为每个学生存储学习信息 我需要知道我的策略是什么。使用实体框架实现这一点,最聪明

我有一个webapp,每天晚上需要导入3个不同的远程XML文件。这些文件包含学生和家长信息、学习信息等

有人能告诉我如何读取XML(通过http),然后在每个学生身上循环,这样我就可以从其他XML文件中添加信息,并将关系存储到我的数据库中吗

需要一些示例代码,如:

  • 打开并读取父XML,并使用XML文件中的固定ID存储在数据库中
  • 打开并读取学生XML并存储在数据库中,并使用父XML中的父id链接到各自的父XML
  • 还为每个学生存储学习信息

我需要知道我的策略是什么。使用实体框架实现这一点,最聪明、最有效的方法是什么

首先是一点建议

当您仅使用webapp时需要注意,因为它不会自动获取更新的文件。至少不是现成的。当一个webapp长时间不使用时,它将被IIS卸载,并且几乎总是一个“反应式”应用程序

但是。。。您可以安排一项任务,在该任务中,您每天晚上的某个特定时间打开一个网页,然后以这种方式开始导入

您可以使用System.Net.HttpWebRequest将xml提取到本地临时文件夹,如下所示:

HttpWebRequest req = WebRequest.Create("http://url.to/file.xml") as HttpWebRequest;

// check if the cast went well
if (req != null) {
    try {
        HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
        System.IO.FileStream outFileStream =  
            System.IO.File.Create(@"Path\To\localfile.xml");

        resp.GetResponseStream().CopyTo(outFileStream);

        outFileStream.Close();
        outFileStream.Dispose();
    }
    catch (ExceptionTypeA ex1) { 
        // Catch all specific exceptions... ommitted here for brevity 
    }
}
然后,您可以使用XDocument/XElement(Linq到Xml)从Xml文件中提取数据,并使用标准ADO.NET API创建和处理DB导入


只有在导入到(关系)数据库之后,才能完全使用实体框架进行数据检索/修改。您甚至可以将所有xml数据转换为POCO类型的结构化集合,并使用实体框架来查询这些集合,但老实说,我不认为这是最好的方法。

我不知道如何将实体框架直接用于xml文件。EF设计用于处理关系数据库

我认为您必须以某种方式将数据导入关系数据库

如果使用SQL Server,则可以使用和实现这样的导入(假设您已经在web服务器上的计划任务帮助下下载了XML文件):

// Create DataSet and load data
DataSet ParentData = new DataSet();
ParentData.ReadXml(Server.MapPath("ParentFile.xml"));

// Create SqlBulkCopy object
SqlConnection connection = new SqlConnection("YourConnectionString");
SqlBulkCopy bulkCopy = new SqlBulkCopy(connection);
bulkCopy.DestinationTableName = "YourParentTable";

// Get DataTable and copy it to database
DataTable ParentTable = ParentData.Tables["Parent"];
bulkCopy.WriteToServer(ParentTable);