Toon posts:

[C#] specifiek element verwijderen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi allemaal

Vandaag heb ik me mp3 playlist omgezet naar XML maar nu wil ik ook de mogelijkheid hebben om 1 liedje te verwijderen alleen het lukt niet.

Ik had dit ingedachte met xpath de juiste liedje selecteren en dan met een functie te verwijderen. Alleen de juiste functie kan ik niet vinden kan iemand mij daar bij helpen. Daannaast wil ie niet de juiste eruit selecteren hij vindt gewoon niks dus daar moet ik ook nog een oplossing voorvinden.

XML file:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<music>
<track>
  <filepath>F:\Albums\3 doors down\The Better Life</filepath> 
  <filefilename>Down Poison.mp3</filefilename> 
  <filecomplete>F:\Albums\3 doors down\The Better Life\Down Poison.mp3</filecomplete> 
  <hasid3tag>True</hasid3tag> 
  <id3title>Down Poison</id3title> 
  <id3artist>3 Doors Down</id3artist> 
  <id3album></id3album> 
  <id3year></id3year> 
  <id3comment /> 
  <id3trackNumber>0</id3trackNumber> 
  <id3genre>12</id3genre> 
  </track>
<track>
  <filepath>F:\Albums\3 doors down\The Better Life</filepath> 
  <filefilename>Here Without You.mp3</filefilename> 
  <filecomplete>F:\Albums\3 doors down\The Better Life\Here Without You.mp3</filecomplete> 
  <hasid3tag>True</hasid3tag> 
  <id3title>Here Without You</id3title> 
  <id3artist>3 Doors Down</id3artist> 
  <id3album>Away From The Sun</id3album> 
  <id3year>2002</id3year> 
  <id3comment /> 
  <id3tracknumber>6</id3tracknumber> 
  <id3genre>17</id3genre> 
  </track>
</music>



C# code
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    XPathDocument doc = new XPathDocument("c:\\playlist.xml");
                XPathNavigator nav = doc.CreateNavigator();

                //Selecteer de gewenst elementen..
                XPathExpression expr; 
                expr = nav.Compile("child::music/track/id3title[.='"+ musicListbox.SelectedItem.ToString() +"']");


                XPathNodeIterator iterator = nav.Select(expr);
                while (iterator.MoveNext())
                {
                    XPathNavigator nav2 = iterator.Current.Clone();
                    //remove ofzo 
                    
                }
            
                
                string id = musicListbox.SelectedItem.ToString();
                musicListbox.Items.Remove(id);
            
                musicListbox.Update();


Kan iemand me helpen, alvast bedankt

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
XML moet je niet (mis)/(ge)bruiken als database.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Waar wil jij XML dan voor gebruiken :?
Ooit een MP3 speler gezien met een mssql database erachter?
Ikke niet, heb op aanrade van de leraar een xml file gebruikt dit is zeer handig.
Ik vind dat xml hier juist voor is.

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 30-04 09:28

Macros

I'm watching...

Playlist moet je gewoon intern in je programma houden in een normale datastructuur zoals een ArrayList/Vector.
Als je dat ee playlist wilt opslaan kan je het naar XML wegschrijven. En dan kan je hem ook weer in zijn geheel inlezen.
Dan is het nooit nodig een element uit je XML te halen en misbruik je je XML ook niet als database.

"Beauty is the ultimate defence against complexity." David Gelernter


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Voor een playlist bij te houden hoef je idd niet met een dergelijke XML file gaan zitten spelen.
Je maakt, zoals Macros zegt een arraylist van objects. Indien je je playlist wilt persisten kan je die arraylist gaan serializen (mbhv binary of soap serialization) naar je disk ofzo.

(XML gebruik je imo vooral als communicatie-middel/data-uitwisseling van gegevens tsn computers/processen/applicaties)

[ Voor 5% gewijzigd door whoami op 07-11-2004 17:07 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Zullen we het zo houden dat ik deze playlist op een PDA staat en dat ik deze ook wil uitwisselen met mijn windows applicatie en website.

Nou wil ik gewoon weten hoe ik een aantal elementen kan verwijderen zo als ik in me starttopic ook zei en niet of ik het wel op de juiste manier doe.
Vergeet niet dat zo'n vrij groot kan worden. Daarnaast is C# niet zuinig met geheugen dus...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Verwijderd schreef op 07 november 2004 @ 17:14:
Zullen we het zo houden dat ik deze playlist op een PDA staat en dat ik deze ook wil uitwisselen met mijn windows applicatie en website.
Dan nog zie ik niet in waarom je hier xml voor gaat gebruiken.
Nou wil ik gewoon weten hoe ik een aantal elementen kan verwijderen zo als ik in me starttopic ook zei en niet of ik het wel op de juiste manier doe.
Vergeet niet dat zo'n vrij groot kan worden. Daarnaast is C# niet zuinig met geheugen dus...
AFAIK zal je die elementen moeten verwijderen door je hele xml file in te lezen, verwijderen en dan je xml die je in memory hebt terugschrijven. Niet echt handig als je 't mij vraagt....
Doe je het met een arraylist dan kan je veel sneller en makkelijker iets verwijderen uit je arraylist en als je wilt kan je ze ook redelijk snel serializen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ja maar nu heb ik bijna me hele applicatie op XML geschreven dus ik wil het wel zo houden. Voor de rest heb je gelijk, maar ja het is op een tip van de leraar.
Dus misschien dat je met me probleem kan helpen en niet verder over array's en serializing te hebben. :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Ik heb gezegd hoe je het kan doen: volledige xml file inlezen (in een xmldatadocument oid), elementen die je wilt verwijderen daaruit verwijderen, en dan het volledige documente dat je dan in 't geheugen hebt, terugschrijven. Dat is imo de enige manier.
Verwijderd schreef op 07 november 2004 @ 17:37:
Ja maar nu heb ik bijna me hele applicatie op XML geschreven
Tja, soms moet je wel eens geschreven code overboord gooien en voor een andere aanpak gaan. (Normaal moet je ook eerst nadenken en dan pas beginnen. :P)

[ Voor 40% gewijzigd door whoami op 07-11-2004 17:43 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Uh ik heb het al ingelezen alleen nu is het probleem dat ik niet het juiste kan pakken en dat kan verwijderen. maar voor de rest bedankt.

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 23:18
FerRory, je leest de XML in mbh van de streamreader of xml reader. Je zet de hele handel in een array ( arraylist oid) en dan kun je daarin gaan zoeken. Lees de docu van C# mbt arrays er nog maar eens op na.. het kan :)

Strava | AP | IP | AW


Verwijderd

Topicstarter
We hebben het al over het geheugen gehad en hierbij zou ik het nog een keer in het geheugen laden. Niemand een idee hoe ik dit oplos met xpath?
ken ik jou trouwens niet?

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 23:18
WAarom zou je iets 2x in het geheugen laden dan? Je leest het bestand in en je slaat de gegevens op in de array. Vervolgens sluit je de file af en je werkt verder dan alleen op die paginaof in die methode met de fileListArray.

offtopic:
waar zou ik je van moeten kennen? en ja ok je hebt tjdens dat je het bestand aan het inlezen in je array dan misschien de gegevens 2x in je app geladen maar whocares..

[ Voor 20% gewijzigd door Webgnome op 07-11-2004 19:02 ]

Strava | AP | IP | AW


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Verwijderd schreef op 07 november 2004 @ 18:54:
We hebben het al over het geheugen gehad en hierbij zou ik het nog een keer in het geheugen laden. Niemand een idee hoe ik dit oplos met xpath?
ken ik jou trouwens niet?
Als je met Xpath aan de slag wil, zal je dat xml document ook moeten inlezen in een XmlDocument of XmlDataDocument....
(Die heeft trouwens ook een RemoveChild method).

[ Voor 6% gewijzigd door whoami op 07-11-2004 19:44 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Zo ik ben er bijna uit :)
Ik heb bedacht om de items te selecteren die niet gelijk zijn aan het het verwijderde item en om dan hem weg te schrijven.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
    while (iterator.MoveNext())
                {
                    //Voeg de items toe.
                    string nav2 = iterator.Current.SelectChildren("id3title");
                    musicListbox.Items.Add(nav2);
                    musicListbox.Update();
                    /*
                    textWriter.WriteStartElement("track");

                        XPathNavigator temp = iterator.Current("filepath");
                        textWriter.WriteElementString("filepath", temp.Value);
                        
                        XPathNavigator temp1 = iterator.Clone("filefilename");
                        textWriter.WriteElementString("filefilename", temp.Value);

                        XPathNavigator temp2 = iterator.Equals("filecomplete");
                        textWriter.WriteElementString("filecomplete", temp.Value);

                        XPathNavigator temp3 = iterator.Equals("hasid3tag");
                        textWriter.WriteElementString("hasid3tag", temp.Value);

                        XPathNavigator temp = iterator.Equals("filepath");
                        textWriter.WriteElementString("id3title", temp.Value);

                        XPathNavigator temp = iterator.Equals("id3artist");
                        textWriter.WriteElementString("id3artist", temp.Value);

                        XPathNavigator temp = iterator.Equals("id3album");
                        textWriter.WriteElementString("id3album", temp.Value);

                        XPathNavigator temp = iterator.Equals("id3year");
                        textWriter.WriteElementString("id3year", temp.Value);

                        XPathNavigator temp = iterator.Equals("id3comment");
                        textWriter.WriteElementString("id3comment", temp.Value);

                        XPathNavigator temp = iterator.Equals("id3trackNumber");
                        textWriter.WriteElementString("id3trackNumber", temp.Value);

                        XPathNavigator temp = iterator.Equals("id3genre");
                        textWriter.WriteElementString("id3genre", temp.Value);
                        
                    textWriter.WriteEndElement();
                
                textWriter.WriteEndElement();
                textWriter.Flush();
                textWriter.Close();
                /*
                string id = musicListbox.SelectedItem.ToString();
                musicListbox.Items.Remove(id);
            
                musicListbox.Update();
                */
                }

Nu is het probleem dat ik een bepaald element niet kan selecteren kan iemand mij daarbij helpen.

Het gaat hierom:
string nav2 = iterator.Current.SelectChildren("id3title");
Die geeft namelijk een fout namelijk:

J:\project\winPlaylist\Form1.cs(267): The best overloaded method match for 'System.Xml.XPath.XPathNavigator.SelectChildren(System.Xml.XPath.XPathNodeType)' has some invalid arguments


Let niet om het commentaar maar dat is om de file weg te schrijven maar dan moet ik wel de waardes weten.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:33
Je geeft een string mee aan die method, en die method verwacht een XPathNodeType

Als je een bepaald element wilt uitlezen uit de node die je opgehaald hebt, dan zal je imo die node zelf moeten doorlopen en checken op de elementname.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Uh maar hoe?
Ik heb geen idee hoe ik dat moet doen?

Verwijderd

niet iets in de trant van:

code:
1
2
3
4
5
6
7
8
9
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("c:\\playlist.xml"); // kan ook LoadXml zijn. ff telui om te zoeken
XmlElement xmlElem = xmlDoc.DocumentElement;
XmlNode xmlNode =xmlDoc.SelectSingleNode("//music[id3album='"+jevarmettitel+"']");
xmlElem.RemoveChild(xmlNode);
    //create the file
            StreamWriter srw = File.CreateText("c:\\playlist.xml");
            srw.WriteLine (xmlDoc.OuterXml);
            srw.Close();


ongetwijfeld een foutje in, maar kan ff niet compilen voor je


edit:

Als je meerdere dezelfde titels verwacht, dan moet je SelectNodes gebruiken en die in een nodelist dumpen en daar dan de RemoveChild() in de foreach aanroepen

[ Voor 20% gewijzigd door Verwijderd op 08-11-2004 16:42 . Reden: SelectNodes ]


Verwijderd

Topicstarter
Ik heb het werkend:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(playlistPlace); // kan ook LoadXml zijn. ff telui om te zoeken
                XmlElement xmlElem = xmlDoc.DocumentElement;
                XmlNode xmlNode =xmlDoc.SelectSingleNode("music/track[id3title='"+ musicListbox.SelectedItem.ToString() +"']");
                xmlElem.RemoveChild(xmlNode);
                //create the file
        
                //xmlDoc.DocumentElement.AppendChild(xmlNode);
                XmlTextWriter wrtr = new XmlTextWriter(playlistPlace, Encoding.Unicode);
                xmlElem.WriteTo(wrtr);
                wrtr.Close();

                string id = musicListbox.SelectedItem.ToString();
                musicListbox.Items.Remove(id);
            
                musicListbox.Update();

Nu nog alleen een functie inbouwen dat ie lege files verwijderd.
Oeps hij verwijderd dit ook: <?xml version="1.0" encoding="utf-16" ?>
Hoe kan ik dat er weer bij zetten.

[ Voor 10% gewijzigd door Verwijderd op 08-11-2004 17:30 ]


Verwijderd

Verwijderd schreef op 08 november 2004 @ 17:29:
Ik heb het werkend:
code:
1
2
3
XmlTextWriter wrtr = new XmlTextWriter(playlistPlace, Encoding.Unicode);
wrtr.WriteStartDocument(); // write <?xml version="1.0" encoding="utf-16" ?> xmlElem.WriteTo(wrtr);
wrtr.Close();

Nu nog alleen een functie inbouwen dat ie lege files verwijderd.
Oeps hij verwijderd dit ook: <?xml version="1.0" encoding="utf-16" ?>
Hoe kan ik dat er weer bij zetten.
Pagina: 1