Avatar billede Mortimer12 Nybegynder
27. januar 2011 - 16:44 Der er 11 kommentarer og
1 løsning

XML i C#

Jeg er ved at lave et lille console-program i Visual Studio 2010.

I det skal jeg have læst en XML-fil. Jeg har den åben og kan fint læse fra den, men jeg kan ikke få det til at spille som jeg vil.


MIN XML-fil:

<?xml version='1.0' standalone='yes'?>
<level>
  <rooms>
    <room>
      <coordinateX>0</coordinateX>
      <coordinateY>0</coordinateY>
      <title>Room 1</title>
      <description>This is room 1</description>
        <exits>
      <exit>North</exit>
      <exit>South</exit>
    </exits>
    </room>
    <room>
      <coordinateX>1</coordinateX>
      <coordinateY>0</coordinateY>
      <title>Room 2</title>
      <description>This is room 2</description>
        <exits>
      <exit>East</exit>
      <exit>West</exit>
    </exits>
    </room>
  </rooms>
</level>


Jeg henter XML-filen ind a la dette:

XmlDocument doc = new XmlDocument();
doc.Load(@"H:\level.xml");

og vil gerne loope over alle room-elementerne:

XmlNodeList xmlRooms = doc.GetElementsByTagName("room");

//Loops over all rooms in XML file
foreach (XmlNode xmlRoom in xmlRooms)
{
  //Kode der udføres for hvert room
}


Dette virker perfekt. Nu er det bare sådan, at jeg for hvert room og gerne vil loope over exits i det pågældende room. Dvs. en foreach i den anden foreach. Men jeg kan ikke bruge samme fremgangsmåde (doc.GetElementsByTagName("exit");. Den fanger jo alle fire exits hver gang og er ligeglad med hvilket room jeg looper over p.t.

Hvordan 'fanger' jeg de to exits i room 1, f.eks.?

På forhånd tak!
Avatar billede arne_v Ekspert
27. januar 2011 - 17:01 #1
Prøv:

xmlRoom.SelectNodes("//exits/exit")
Avatar billede heinzdmx Nybegynder
27. januar 2011 - 17:05 #2
Ifølge:
http://msdn.microsoft.com/en-us/library/dc0c9ekk.aspx

Note
It is recommended that you use the XmlNode.SelectNodes or XmlNode.SelectSingleNode method instead of the GetElementsByTagName method.


Så vil anbefale dig at kigge på de metoder i stedet for.
Avatar billede Mortimer12 Nybegynder
27. januar 2011 - 17:09 #3
Nu har jeg indsat XmlNodeList xmlExits = xmlRoom.SelectNodes("//exits/exit");
i stedet for den anden linje.

Som jeg ser det looper den stadig over alle fire exits for hvert room. Kan det ikke passe?
Avatar billede Mortimer12 Nybegynder
27. januar 2011 - 17:11 #4
Hovsa, jeg havde ikke set sidste kommentar. Jeg kigger på det!
Avatar billede arne_v Ekspert
27. januar 2011 - 17:12 #5
Lyder mystisk.

Den bør kun tage exits nedenunder det pågældende xmlRoom.
Avatar billede Mortimer12 Nybegynder
27. januar 2011 - 17:17 #6
Det er nok bare mig der bøvler rundt i det, her første jeg prøver bruger XML og cirka tredje gang jeg bruger C# :)
Avatar billede Mortimer12 Nybegynder
27. januar 2011 - 17:25 #7
Hvis jeg gør som du skriver:

XmlNodeList xmlRooms = doc.SelectNodes("//rooms/room");

//Loops over all rooms in XML file
foreach (XmlNode xmlRoom in xmlRooms)
{
  XmlNodeList xmlExits = xmlRoom.SelectNodes("//exits/exit");
  Console.WriteLine(xmlExits.Count);
}

Med den XML-fil jeg skrev i første indlæg, giver .Count 4 (begge gange løkken kører). Tilføjer jeg én mere i 'room 2' giver den 5.
Avatar billede arne_v Ekspert
27. januar 2011 - 17:36 #8
xmlRoom.SelectNodes("exits/exit")

uden // forrrest
Avatar billede Mortimer12 Nybegynder
27. januar 2011 - 18:08 #9
Ja, selvfølgelig. Dumme mig jeg ikke havde prøvet det. Nu virker det!

Jeg takker mange gange. Læg svar, hvis du vil have point!
Avatar billede arne_v Ekspert
27. januar 2011 - 22:17 #10
svar
Avatar billede arne_v Ekspert
27. januar 2011 - 22:18 #11
Det ovarrasker faktisk også mig at den kan søger over den node man kalder SelectNodes på!
Avatar billede Mortimer12 Nybegynder
28. januar 2011 - 08:38 #12
Ja, det giver, rent logisk, ikke mening. Udover at // vel betyder roden af XML-filen. Men roden, set udfra en node, bør logisk set jo være noden selv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester