如何在插入SqlServer数据库之前用XML编写解析和提取的数据

时间:2014-06-18 05:18:05

标签: c# xml linq

我的Web应用程序中有一组解析器组件函数,它能够解析和提取以下平面文件中的数据

  

1)TabDelimitedFile.FileExtenstion使用解析和提取   This Reference !!

     

2)使用LinqToXml

解析和提取File.XML文件数据      

3)使用LinqtoExcel

解析和提取Excel.xlsx文件数据

在解析和提取数据集时,我使用LinqToSql Classes和DBMLDataContext将它们插入到我的Sql Server databAse中。

我的要求:在插入已解析和提取的数据之前,我想将这些数据集写入XML文件中以供用户验证,然后在用户接受时插入数据库表中。

如何继续?

我的C#解析器组件工作流程:

protected void Button1_Click(object sender, EventArgs e)
   {
        try
        {
            string path = Server.MapPath("~/App_data" + "/" + "Folder" + "/" + DropDownList1.Text + "/");
            IFileParser fileParser = new DefaultFileParser(First_Inserted);
            string destinationTableName = "My Table";
            string sourceFileFullName = GetFileFullName(path);
            IEnumerable<DataTable> dataTables = fileParser.GetFileData(sourceFileFullName);
            foreach (DataTable tbl in dataTables)
            {
                fileParser.WriteChunkData(tbl, destinationTableName, Map());
            }

            Appln_parse_xml1(path); 
            Appln_parse_xml2(path); 
            Appln_parse_xml3(path);
            Appln_parse_Excel(path);
        }
   }

private static bool Appln_parse_xml3(string _xml3_path)
    {
        bool parse_status = false;
        DataClasses1DataContext dbContext = new DataClasses1DataContext();

        //XML File

        List<string> xml3 = System.IO.Directory.GetFiles(@_xml3_path, "*.xml", SearchOption.AllDirectories).ToList<string>();

        foreach (var _files in xml3)
        {

            var xdoc = XDocument.Load(_files);
            XNamespace ns = xdoc.Root.GetDefaultNamespace();

            var groups = from g in xdoc.Descendants(ns + "Group")
                         where (string)g.Attribute("name") == "Model Name"
                         select new First_DBML
                         {

                             Comp_Value = Decimal.Parse((from c in g.Elements(ns + "Group").Descendants(ns + "Cell")
                                                         where (string)c.Attribute("c") == "0"
                                                         select c.Value).First()),
                         };

            dbContext.First_DBMLs.InsertAllOnSubmit(groups);
            //Before Insertion need to write in xml for this Comp_value for user validation
            dbContext.SubmitChanges();
            // Inserting  into My_Table 
        }

1 个答案:

答案 0 :(得分:0)

根据我对您的问题的理解,您可以执行以下操作。 在Appln_parse_xml3函数中,当前使用dbContext.First_DBMLs.InsertAllOnSubmit(groups)将所有已解析的对象保存到数据库中; 在这里,您可以将对象绑定到转发器控件,而不是保存它。此转发器应显示所有已解析的对象,并为每个对象提供接受按钮。 您可以在转发器项中显示每个对象的属性,以便用户能够判断是否接受。如果要为用户显示xml,则可以将对象序列化为xml并在转发器中显示它们。

用户单击“接受”后,您可以从转发器项创建组对象并将其保存到数据库中。如果您将对象显示为xml,则可以将xml序列化为对象并将其保存到数据库中。

要将对象序列化为xml,您可以使用以下函数。

        private string Serialize(object value)
        {
            System.IFormatProvider provider = System.Globalization.CultureInfo.CurrentCulture;
            StringBuilder builder = new StringBuilder();
            string serializedString = string.Empty;
            try
            {
                XmlSerializer xs = new XmlSerializer(value.GetType());
                XmlWriter xmlTextWriter = XmlTextWriter.Create(builder);
                xs.Serialize(xmlTextWriter, value);
                serializedString = builder.ToString();
                xmlTextWriter.Close();
            }
            catch (Exception ex)
            {
                serializedString = "Serialization exception  : " + ex.Message + ex.StackTrace;
            }
            return serializedString;
        }

您可以使用以下代码将xml转换回您的对象

XmlSerializer serializer = new XmlSerializer(typeof(First_DBML));
First_DBML ei = (First_DBML)serializer.Deserialize(new StringReader(xmlString));   

我希望我理解得当。