C# 在一个XML文件中保存并加载两次DataTable,然后加载它
我在将2x数据表保存到1个xml文件中时遇到问题 我正在使用c#.Net 4.6+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
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中,然后保存它