2016-07-11 9 views
0

ich eine XML-Datei wie folgt aussehen:eine XML-Datei im Hinblick auf Datagrid laden und speichern sie wieder nach dem Update

  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); 
      } 

Jetzt:

<xml version="1.0" encoding="UTF-8"> 

    <configes> 

    <Username>Administrator</Username> 

    <Password>123456</Password> 

    <Domain>sample</Domain> 

    <Url>http://sample/Organization.svc</Url> 

    </configes> 

ich es in einem Datagridview durch so etwas wie dieses geladen Ich möchte einige Attribute ändern (Wert bearbeiten oder neues Attribut hinzufügen) und sie erneut in derselben Datei speichern. Ich versuche, diese aber es funktioniert nicht:

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

wenn GetDataTableFromDGV so etwas wie diese:

 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; 
+0

I posted differents antworten, dass Ihr Problem lösen, können Sie Ihre XML-Datei als Datentabelle :) verwenden, meine Antworten hier: http://stackoverflow.com/questions/38261881/editing-xml-on- Live-in-c-löschen-Nodes-das-enthalten-spezifischen-Wert/38262575 # 38262575 und hier http://StackOverflow.com/Questions/38180836/How-Do-I-Read-XML-as-an-array -wie-json-decode-tut-aber-in-c/38181110 # 38181110 – Furtiro

+0

Wie ich in meiner Frage sagte, konnte ich XML-Datei ohne jedes Problem laden. Ich möchte es nur in der gleichen Form speichern, nachdem ich DGV aktualisiert habe. – Farhad

Antwort

1

Tun Sie es einfach.

definieren Formularfeld (nicht lokale Variable):

DataSet dataSet = new DataSet(); 

Laden von Daten aus der Datei:

dataSet.ReadXml(filename); 

Bind Datentabelle zu Datagridview:

dataGridView.DataSource = dataSet.Tables[0]; 

Die Daten angezeigt werden in DataGridView. Jetzt können Sie sie bearbeiten.

speichern Daten in die Datei:

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

Wenn Sie jede Spalte und seinen Wert in einer Zeile angezeigt werden soll, dann haben Sie zwei Varianten.

  1. Ändern der XML-Dateiformat wie folgt:

    <?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> 
    

    In diesem Fall können Sie über kurze und saubere C# -Code verwenden.

  2. Wenn Sie das Format der XML-Datei nicht ändern können, müssen Sie es manuell analysieren und die Werte in die DataTable einfügen.

+0

Jetzt in Datagridview Xml-Datei zeigt in einer Zeile und anderen Spalte (so viel wie XML-Knoten). Wie könnte ich jede Spalte und ihren Wert in einer Zeile anzeigen? – Farhad

+0

@Farhad - siehe Update. –

+0

Vielen Dank nochmal @Alexander Petrov – Farhad

0

Wie ich Ihnen in meinem Kommentar gesagt, ist die Lösung für Ihr Problem in einer alten Antwort hier: Editing xml on live in C#. Deleting nodes that contain specific value

Aber wenn man will ich dies für Sie neu schreiben kann ....

Sie haben Ihre xML-Datei in eine gespeicherte Unter der Annahme, dataTable, wenn Sie die Daten in dieser Datentabelle bearbeiten, können Sie Ihre XML-Datei wie die erste neu schreiben.

//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) 

Mein Eingang: (test.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> 

Meine Ausgabe nach dem vorherigen Code:

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