Autor Beitrag
PachN
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Fr 11.02.11 19:24 
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:

ausblenden 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.

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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):
ausblenden 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

Für diesen Beitrag haben gedankt: PachN
PachN Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: 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