将 xml 文件加载到数据网格视图,并在更新后再次保存

本文关键字:更新 保存 视图 加载 文件 xml 数据 网格 数据网 | 更新日期: 2023-09-27 17:56:31

我有一个这样的xml文件:

<xml version="1.0" encoding="UTF-8">
<configes>
<Username>Administrator</Username>
<Password>123456</Password>
<Domain>sample</Domain>
<Url>http://sample/Organization.svc</Url>
</configes>

我通过这样的东西将其加载到数据网格视图中:

DataGridViewRow row;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(txtXmlAdd.Text);
XmlElement elm = xmlDoc.DocumentElement;
XmlNodeList nodeList =  elm.ChildNodes;
foreach (XmlNode node in nodeList)
{
    row = (DataGridViewRow)dgvXML.Rows[0].Clone();
    row.Cells[0].Value = node.Name ;
    row.Cells[1].Value = node.InnerText;
    dgvXML.Rows.Add(row);
 }

现在,我想更改一些属性(编辑值或添加新属性)并再次将其保存到同一文件中。我试了这个,但它不起作用:

DataTable dT = GetDataTableFromDGV(dgvXML);
DataSet dS = new DataSet();
dS.DataSetName = "configes";
dS.Tables.Add(dT);
dS.WriteXml(string path);

当 GetDataTableFromDGV 是这样的:

var dt = new DataTable();
dt.TableName="";            
string firstCol = "";
string secCol = "";
object[] cellValues = new object[1];
foreach (DataGridViewRow row in dgv.Rows)
{
    secCol = row.Cells[1].Value.ToString();
    firstCol = row.Cells[0].Value.ToString();
    dt.Columns.Add(firstCol);
    cellValues[0] = row.Cells[1].Value;                    
    dt.Rows.Add(cellValues);
}
return dt;

将 xml 文件加载到数据网格视图,并在更新后再次保存

做简单的事情。

定义表单字段(非局部变量):

DataSet dataSet = new DataSet();

从文件加载数据:

dataSet.ReadXml(filename);

将 DataTable 绑定到 DataGridView:

dataGridView.DataSource = dataSet.Tables[0];
数据

将显示在数据网格视图中。现在您可以编辑它们。

将数据保存到文件:

dataSet.Tables[0].WriteXml(filename);

如果要在一行中显示每列及其值,则有两个变体。

  1. 更改 xml 文件格式,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <Root>
      <configes>
        <Name>UserName</Name>
        <Value>Administrator</Value>
      </configes>
      <configes>
        <Name>Password</Name>
        <Value>123456</Value>
      </configes>
      <configes>
        <Name>Domain</Name>
        <Value>sample</Value>
      </configes>
      <configes>
        <Name>Url</Name>
        <Value>http://sample/Organization.svc</Value>
      </configes>
    </Root>
    

    在这种情况下,您可以使用上面简短干净的 C# 代码。

  2. 如果无法更改 xml 文件的格式,则必须手动分析它并将值放入数据表中。

正如我在评论中告诉您的那样,您的问题的解决方案在这里的一个旧答案中:在 C# 中实时编辑 xml。删除包含特定值的节点

但是如果你愿意,我可以为你重写这个....

假设您将 xml 文件存储在数据表中,

如果您编辑此数据表中的数据,则可以像第一个文件一样重写 xml 文件。

//READ THE XML FILE
XmlDocument xmlDoc = new XmlDocument();
//My path
xmlDoc.LoadXml(Properties.Resources.test);
//Read the xml file into a dataSet
DataSet ds = new DataSet();
XmlNodeReader xnr = new XmlNodeReader(xmlDoc);
ds.ReadXml(xnr);
//Your data will be store in the 4's dataTable of the dataSet ( the <field> )
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
    //RemoteAt will remove all the node, so the node <Field> in your example data
    ds.Tables[0].Rows[0][i] = "NEWVALUE";
    //If you want to only remove the node <Value>  (and not all the <Field> node ) just do ds.Tables[4].Rows["Value"]=null;
}
//Write your new content in a new xml file
//As you wanted here you just read the new xml file created as a string
using (var stringWriter = new StringWriter())
using (var xmlTextWriter = XmlWriter.Create(stringWriter))
{
    ds.WriteXml(xmlTextWriter);
    xmlTextWriter.Flush();
    stringWriter.GetStringBuilder().ToString();
    //Here the result is in stringWriter,  and  there is 6 <Field> nodes, and not 8 like before the suppress
}
//If you want to create a new xml file with the new content just do 
ds.WriteXml(pathOfTheFirstXmlFile);
//( like rewriting the previous xml file )

我的输入: ( 测试.xml )

<?xml version="1.0" encoding="UTF-8"?>
<configes>
<Username>Administrator</Username>
<Password>123456</Password>
<Domain>sample</Domain>
<Url>http://sample/Organization.svc</Url>
</configes>

我在上一个代码之后的输出:

<?xml version="1.0" standalone="yes"?>
<configes>
  <Username>NEWVALUE</Username>
  <Password>NEWVALUE</Password>
  <Domain>NEWVALUE</Domain>
  <Url>NEWVALUE</Url>
</configes>