Entwickler-Ecke

IO, XML und Registry - XML Attribute Value ändern


PachN - Fr 11.02.11 19:24
Titel: XML Attribute Value ändern
Hallo zusammen,

ich habe mir hier schon einiges durch gelesen und auch schon einige Anregungen gefunden, doch leider passt nichts so wirklich zu meinem Problem, oder ich bin gerade einfach nur zu doof dafür.

Folgendes:
Ich habe eine XML Datei, die in etwa so aussieht:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<?xml version="1.0" encoding="UTF-8"?>
<Database Version="702">                                                                                                                                                                                  
<Song FilePath="C:\Users\xxx\xxx\xxx\ftw.mp3" FileSize="500144">
  <Display Genre="Other" Color="5678931" Cover="162" Tag="1" />
  <Infos FirstSeen="1012111957" />
 </Song>
 <Song FilePath="C:\Das ist - ein Lied.mp3" FileSize="31729238" Flag="64">
  <Display Color="13747094" Cover="2210" Tag="1" />
  <Infos FirstSeen="1012312017" />
 </Song>
 
</Database>



Natürlich ist sie viel größer und länger, aber der Aufbau stimmt soweit.

Zwei Fragen nun:

1. Wie bekomme ich es hin, dass ich über die Knoten iterieren kann und dabei Werte abfrage?

2. Wie kann ich dann einen solchen Wert, nehmen wir mal "FilePath" ändern?

Ich versuche mich gerade an dem XDocument aber das will noch nicht so ganz.


C#-Quelltext
1:
2:
3:
4:
5:
XDocument xmlDoc;
XmlTextReader reader = new XmlTextReader(@txtFile.Text);
xmlDoc = XDocument.Load(reader);

XElement root = xmlDoc.Element("Database");


Mal gekürzt zusammen geschrieben.
WEnn ich das jetzt richtig verstanden habe, dann bekomme ich in root, das komplette XML-Dokument.
Wie nun jeden Knoten "Song" auf einen bestimmten Wert abfragen?


Zweites was ich versucht habe war per XmlDocument.
Muss das jetzt mal kurz aus dem Kopf schreiben hab den Code nicht mehr vor mir:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
//Deklarationen usw.
XmlElement root = xmlDoc.Children("Database");
foreach (XmlNode @element in root)
{
 if (@element.Name == "Song")
 {
   if (!File.Exists(@element.Attributes["FilePath"].InnerText))
   {
     songs.Add(@element.Attributes["FilePath"].InnerText);
   }
 }
}


Das ging soweit ganz gut, aber dann konnte ich den Wert von Attributes["FilePath"] irgendwie nicht ändern :(

Kann mir mal bitte einer auf die Sprünge helfen und mir sagen wie ich die entsprechenden Nodes durchlaufen und ggf. Werte ändern kann?

Ach ja, und das ganze dann natülich auch in die XML-Datei schreibe...


Ich hab genug für heute,

lg PachN

Moderiert von user profile iconChristian S.: Code- durch XML-Tags ersetzt
Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Trashkid2000 - Fr 11.02.11 22:26

Hallo und :welcome:

Das Ganze ist eigentlich ganz einfach.
Zu 1.) und 2.) - denke, dass Dir das beim Verständnis weiterhilft (der Code ist dank der Element- und Attributnamen denk ich gleich zu verstehen):

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
XDocument doc = XDocument.Load(path);
foreach (XElement song in doc.Descendants("Song")) //alle Song-Knoten durchgehen
{
  XAttribute filePathAttribute = song.Attribute("FilePath");
  if (filePathAttribute != null)
    filePathAttribute.Value = "neuer Pfad";
                
  XElement display = song.Element("Display");
  XAttribute genreAttribute = display.Attribute("Genre");
  if (genreAttribute != null)
    genreAttribute.Value = "neues Genre";
}
doc.Save(path);
LG, Marko


PachN - Mo 14.02.11 15:14

Argh, manchmal ist es doch so einfach, wenn man sich auskennt :)
Hab erst gerade angefangen mich mit XML Bearbeitung auseinander zu setzen.

Auf jedenfall ein riesen Dankeschön für die schnelle Hilfe! *bedank*

Problem ist somit (vorerst) gelöst!

LG PachN