2

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

有人可以告诉我如何读取 XML(通过 http)然后遍历每个学生,以便我可以添加来自其他 XML 文件的信息并将关系存储到我的数据库中吗?

需要一些示例代码,例如:

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

我需要知道我的策略是什么。使用 Entity Framework 完成此任务的最聪明和最有效的方法是什么?

4

2 回答 2

0

先给点建议。。

当您只使用 web 应用程序时需要注意,因为它不会自动获取更新的文件。至少不是开箱即用的。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 to Xml) 从 Xml 文件中提取数据,并使用标准 ADO.NET API 创建和处理 DB 导入。

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

于 2012-10-30T15:13:15.023 回答
0

我看不到您将如何直接将实体框架与您的 XML 文件一起使用。EF 旨在与关系数据库一起使用。

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

如果使用 SQL Server,您可以使用DataSetSqlBulkCopy实现这样的导入(假设您已经借助 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);
于 2012-10-30T15:13:23.470 回答