Laden...

datasets und xml

Erstellt von foxm vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.605 Views
F
foxm Themenstarter:in
21 Beiträge seit 2005
vor 18 Jahren
datasets und xml

hi leute!

habe ein "problem" und zwar... ich möchte aus einer xml datei einen wert auslesen, verändern und zurückspeichern!
das ganze hätt ich mir wie folgt vorgestellt, jedoch ohne erfolg! es wird nichts geändert!


DataSet ds = new DataSet();
ds.ReadXml(configFile);
DataTable dt = ds.Tables["add"]; //add ist der tablle name bzw -> <add key=...
foreach (DataRow r in ds.Rows)
{
r.ItemArray.SetValue(_blabla.text, 1);
MessageBox.Show(r.ItemArray.GetValue(1).ToString(), "Warnung"); //alter wert :(
MessageBox.Show(r.RowState.ToString(), "Warnung2"); //bekomme hier "added"
}
ds.WriteXml(configFile);

ich danke euch recht herzlich im voraus!

so long 🙂

3.728 Beiträge seit 2005
vor 18 Jahren
Dom

DataSets sind dafür nicht geeignet, da sie einem eigenen Schema genügen. Deine XML-Datei entspricht diesem Schema nicht. Man schreibt keine Config-Files mit DataSets. Was Du brauchst ist ein System.Xml.XmlDocument. Damit kannst Du XML sehr leicht laden, verändern und wieder speichern.

So könnte Dein Code mit einem XmlDocument aussehen:


// Ich gehe davon aus, dass System.Xml importiert wird.

// Konfiguration laden
XmlDocument config=new XmlDocument();
config.Load(configFile); 

// Zu verändernde Konfigurationseinstellung adressieren
// Da ich das Schema Deiner XML-Datei nicht kenne, habe ich einen Dummy XPath-Ausdruck verwendet.
XmlNode addNode=config.DocumentElement.SelectSingleNode("add[@key='Entry1']");

// Attribut verändern
addNode.Attributes["text"].Value="Warning!";

// Konfiguration speichern
config.Save(configFile);

F
foxm Themenstarter:in
21 Beiträge seit 2005
vor 18 Jahren

besten dank 🙂 werde ich heute abend umgehend ausprobieren!
die xml datei sieht nur wie folgt aus:


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <appSettings>
     <add key="Remoting" value="tcp://127.0.0.1:8282"/>
   </appSettings>
</configuration>

ich möchte eben hierbei die remote ip ändern 🙂

so long

F
foxm Themenstarter:in
21 Beiträge seit 2005
vor 18 Jahren

ich brauche dennoch nochmal deine hilfe bitte... ich schaffs nicht... wollte soeben das auslesen auch auf diese methode machen... aber ohne erfolg... mit node.value könnte ich doch den wert auslesen?
aber erhalte immer die meldung -> NullReferenceException...?!

thx!

G
42 Beiträge seit 2005
vor 18 Jahren

Hi foxm,

Mit XmlNode.value liest du den Inhalt des Knotens aus.
Allerdings hast du keinen Inhalt in deinem Knoten

<add key="Remoting" value="tcp://127.0.0.1:8282" />

Deswegen kommt auch die NullReferenceException

Du willst - so wie ich das verstehe - auf ein Attribut zugreifen, schau die hierzu einfach mal XmlNode.Attributes an

Gruß, Gloki

F
foxm Themenstarter:in
21 Beiträge seit 2005
vor 18 Jahren

aso, das leuchtet irgendwie ein 🙂
aber wie finde ich dann diese "node" mit folgendem code erhalte ich nichts?


XmlNode node = doc.SelectSingleNode("add");
MessageBox.Show(node.Attributes.ToString(), "blabla"); //-> wieder eine nullpointexception :(

besten dank 🙂

G
42 Beiträge seit 2005
vor 18 Jahren

Versuch es mal damit:

            XmlNode node = config.SelectSingleNode("//add");
MessageBox.Show(node.Attributes["value"].Value, "blabla");

Du musst natürlich angeben, welches Attribut du haben willst und dass du den Wert des Attributes willst.

Die '//' vor dem add bedeuten: Suche das erste Auftreten des Knotens mit der Bezeichnung 'add' (Hast du mehrere Knoten add, dann musst du einen anderen XPath benutzen).

Gruß, Gloki

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo zusammen,

die Kombination zwischen Glokis Vorschlag und Rainbirds Quellcode liefert hier das gewünschte Ergebnis:


// Ich gehe davon aus, dass System.Xml importiert wird.

// Konfiguration laden
XmlDocument config=new XmlDocument();
config.Load(configFile);

// Zu verändernde Konfigurationseinstellung adressieren
// Da ich das Schema Deiner XML-Datei nicht kenne, habe ich einen Dummy XPath-Ausdruck verwendet.
XmlNode addNode=config.DocumentElement.SelectSingleNode("/configuration/appSettings/add[@key='Remoting']");

// Attribut verändern
addNode.Attributes["value"].Value="tcp://127.0.0.1:8282";

// Konfiguration speichern
config.Save(configFile);

Wobei ich bei einer App.config anders vorgehen würde, da hier schon Konfiguration automatisch in ein .NET Array eingelesen wird. Ebenso kann man hier Konfigurationen erzeugen und schreiben.

Beispiel:



using System;
using System.Configuration;

namespace Test
{
   public class Test
   {
      public Test()
      {
         Console.Writeline(ConfigurationSettings.AppSettings["Remoting"]);
      }
   }
}

Bedingung hier ist, dass die Konfigurationsdatei 'app.config' heißt, und so aufgebaut ist, wie Du hier schon gepostet hast:



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <appSettings>
     <add key="KEYNAME" value="VALUEZUMKEY"/>
     <add key="KEYNAME2" value="VALUEZUMKEY2"/>
     <!-- und so weiter und so weiter -->
   </appSettings>
</configuration>


Einfacher zum handhaben, nicht? Damit Du richtig damit umgehen kannst, würde ich mir in der MSDN oder in der SDK-Doku den Namensraum System.Configuration und hier speziell die Klasse 'ConfigurationSettings' anschauen...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

F
foxm Themenstarter:in
21 Beiträge seit 2005
vor 18 Jahren

besten dank 🙂 habs geschafft!
verzeiht die umstände... aber dieses xml... hätte es am liebesten schon mit einem binary reader gelöst X(

so long