Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个XML文件中保存并加载两次DataTable,然后加载它_C#_Xml_Datatable_Load - Fatal编程技术网

C# 在一个XML文件中保存并加载两次DataTable,然后加载它

C# 在一个XML文件中保存并加载两次DataTable,然后加载它,c#,xml,datatable,load,C#,Xml,Datatable,Load,我在将2x数据表保存到1个xml文件中时遇到问题 我正在使用c#.Net 4.6+ DataTable dt = (DataTable)dataGridView1.DataSource; DataTable dt1 = (DataTable)dataGridView2.DataSource; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "XML|*.xml"; if (sfd.ShowDialog() == Di

我在将2x数据表保存到1个xml文件中时遇到问题

我正在使用c#.Net 4.6+

DataTable dt = (DataTable)dataGridView1.DataSource;
DataTable dt1 = (DataTable)dataGridView2.DataSource;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "XML|*.xml";
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            try
            {
                dt.WriteXml(sfd.FileName);
                dt1.WriteXml(sfd.FileName);
            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex);
            }
        }
用于加载数据im,请使用:

 OpenFileDialog sfd = new OpenFileDialog();
 sfd.Filter = "XML|*.xml";
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                string file = sfd.FileName;
                try
                {

                    dt.ReadXml(file);
                    dt1.ReadXml(file);

                }
                catch (Exception ex)
                {
                    //Console.WriteLine(ex);
                }
            }
我想将dt和dt1保存到xml文件中,然后按1个xml文件加载它

我怎样才能保存它?
当我使用上面的代码时,dt1会覆盖dt。

例如,您可以从使用类创建自定义XML开始 与文字作者联合

    TextWriter writer = null;

                    try
                    {
                        XmlDocument doc = new XmlDocument();

                        //xml decleration
                        var xmlDecleration = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");

                        doc.AppendChild(xmlDecleration);

                        //create the 
                        XmlElement rootElement = doc.CreateElement("datatableTopLevelElement");//, HierachyFileConstants.EXPORT_NAMESPACE);//the root element
                        XmlAttribute versionAttribute = doc.CreateAttribute("someVersionAttribute");
                        versionAttribute.Value = Version;//set the version number
                        rootElement.Attributes.Append(versionAttribute);

                        doc.AppendChild(rootElement);

    XmlElement dataObjectType = doc.CreateElement("FirstDataTable");//element name

    using (var ms = new MemoryStream())
                            {
                                var serializer = new XmlSerializer(dataType.GetType());//datatable type(if you know it)
                                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                                ns.Add("", "");
                                writer = new StreamWriter(ms);
                                serializer.Serialize(writer, dataType, ns);

                                //for some reason using xmlSettings with UTF-8 encoding creates an extra unecessary character

                                //remove first line of xml file
                                var xmlData = string.Join(Environment.NewLine, Encoding.UTF8.GetString(ms.ToArray())
                                    .Split(Environment.NewLine.ToCharArray())
                                    .Skip(1)
                                    .ToArray());

                                var xmlElement = GetElement(xmlData);

                                dataObjectType.AppendChild(dataObjectType.OwnerDocument.ImportNode(xmlElement, true));
                            }

//end of first datatable -- repeat from first datable method to add second datatable(
     }
                        }

                    }

                    //var tes
                    //return new XmlDocument().LoadXml(doc.OuterXml.Replace("xmlns=\"" + string.Empty + "\"",string.Empty));
                    var docToReturn = new XmlDocument();
                    docToReturn.LoadXml(doc.OuterXml.Replace("xmlns=\"" + string.Empty + 

    "\"", string.Empty));
                        return docToReturn;
    }


The GetElement method looks like this 

    private XmlElement GetElement(string xml)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
                //doc.DocumentElement.NamespaceURI
                return doc.DocumentElement;
            }

在添加第一个datatable之后—添加第二个datatable以将其添加到xml中,或者创建datatable的列表并执行foreach语句以使其更简单 与文字作者联合

    TextWriter writer = null;

                    try
                    {
                        XmlDocument doc = new XmlDocument();

                        //xml decleration
                        var xmlDecleration = doc.CreateXmlDeclaration("1.0", "UTF-8", "yes");

                        doc.AppendChild(xmlDecleration);

                        //create the 
                        XmlElement rootElement = doc.CreateElement("datatableTopLevelElement");//, HierachyFileConstants.EXPORT_NAMESPACE);//the root element
                        XmlAttribute versionAttribute = doc.CreateAttribute("someVersionAttribute");
                        versionAttribute.Value = Version;//set the version number
                        rootElement.Attributes.Append(versionAttribute);

                        doc.AppendChild(rootElement);

    XmlElement dataObjectType = doc.CreateElement("FirstDataTable");//element name

    using (var ms = new MemoryStream())
                            {
                                var serializer = new XmlSerializer(dataType.GetType());//datatable type(if you know it)
                                XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                                ns.Add("", "");
                                writer = new StreamWriter(ms);
                                serializer.Serialize(writer, dataType, ns);

                                //for some reason using xmlSettings with UTF-8 encoding creates an extra unecessary character

                                //remove first line of xml file
                                var xmlData = string.Join(Environment.NewLine, Encoding.UTF8.GetString(ms.ToArray())
                                    .Split(Environment.NewLine.ToCharArray())
                                    .Skip(1)
                                    .ToArray());

                                var xmlElement = GetElement(xmlData);

                                dataObjectType.AppendChild(dataObjectType.OwnerDocument.ImportNode(xmlElement, true));
                            }

//end of first datatable -- repeat from first datable method to add second datatable(
     }
                        }

                    }

                    //var tes
                    //return new XmlDocument().LoadXml(doc.OuterXml.Replace("xmlns=\"" + string.Empty + "\"",string.Empty));
                    var docToReturn = new XmlDocument();
                    docToReturn.LoadXml(doc.OuterXml.Replace("xmlns=\"" + string.Empty + 

    "\"", string.Empty));
                        return docToReturn;
    }


The GetElement method looks like this 

    private XmlElement GetElement(string xml)
            {
                XmlDocument doc = new XmlDocument();
                doc.LoadXml(xml);
                doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
                //doc.DocumentElement.NamespaceURI
                return doc.DocumentElement;
            }
在添加第一个datatable之后—添加第二个datatable以将其添加到xml中,或者创建一个datatable列表并执行foreach语句以使其更简单,正如我在评论中所说的那样。 最好且更简单的方法是在数据集中添加datatables

数据集按代码合并到1中:

  DataTable dt = (DataTable)dataGridView1.DataSource;
  DataSet ds = new DataSet();
  DataSet ds1 = new DataSet();
  ds.Tables.Add(dt);
  ds1.Tables.Add(dt1);
                DataTable dt1 = (DataTable)dataGridView2.DataSource;
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "XML|*.xml";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        ds.Merge(ds1);
                        ds.WriteXml(sfd.FileName);
                        //dt1.WriteXml(sfd.FileName);
                    }
                    catch (Exception ex)
                    {
                        //Console.WriteLine(ex);
                    }
                }
然后像这样加载它:

   OpenFileDialog sfd = new OpenFileDialog();
        sfd.Filter = "XML|*.xml";
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            string file = sfd.FileName;
            try
            {

                dt.ReadXml(file);
                dt1.ReadXml(file);

            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex);
            }
        }
正如我在评论中所说的那样。 最好且更简单的方法是在数据集中添加datatables

数据集按代码合并到1中:

  DataTable dt = (DataTable)dataGridView1.DataSource;
  DataSet ds = new DataSet();
  DataSet ds1 = new DataSet();
  ds.Tables.Add(dt);
  ds1.Tables.Add(dt1);
                DataTable dt1 = (DataTable)dataGridView2.DataSource;
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "XML|*.xml";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        ds.Merge(ds1);
                        ds.WriteXml(sfd.FileName);
                        //dt1.WriteXml(sfd.FileName);
                    }
                    catch (Exception ex)
                    {
                        //Console.WriteLine(ex);
                    }
                }
然后像这样加载它:

   OpenFileDialog sfd = new OpenFileDialog();
        sfd.Filter = "XML|*.xml";
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            string file = sfd.FileName;
            try
            {

                dt.ReadXml(file);
                dt1.ReadXml(file);

            }
            catch (Exception ex)
            {
                //Console.WriteLine(ex);
            }
        }

你的代码似乎很难。你能在我的示例数据表上演示一下吗?我认为我应该越容易将这些表添加到数据集中,然后将数据集合并到1中,然后保存它。想法是创建小的XML片段并将它们添加到最终的XML中。您的代码似乎很难。您能在我的示例数据表中演示一下吗?我认为将这些表添加到数据集越容易,然后将数据集合并到1中,然后保存它