Laden...

XML Datei richtig in eine List<structur> laden.

Erstellt von Piwi vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.510 Views
P
Piwi Themenstarter:in
4 Beiträge seit 2008
vor 6 Jahren
XML Datei richtig in eine List<structur> laden.

Hallo zusammen!
Ich bin am verzweifeln und weiß mir nicht mehr zu helfen.
Würde mich sehr freuen wenn mir jemand wieder auf die Sprünge helfen könnte.

Würde gerne diese XML Datei laden und sämtliche Zeilen welche unter <Boxes> stehen in die List bekommen.
Bekomme das einfach nicht gebacken. 😦

Im Grunde funktioniert es auch solange nur eine Zeile "<Tiles Boxart="Mauer" Position="0 900 270 130" Collide="1" />" unter <Boxes> steht.
Aber genau hier möchte ich ja mehr Zeilen in die List lesen. Ich bin mir eigentlich ziemlich sicher das es an der Definition meiner Boxes Class scheitert.

.


namespace MyXMLData
{
    public class LevelInfo
    {
        public LevelInfo()
        {
        }
        public string LevelName;
        public string Background;
        public Vector2 Worldsize;
        public Vector2 Startpunkt;
    }


    public class MyLevel
        {
            public MyLevel()
            {
            }
            public LevelInfo LevelInfo;
            public Boxes Boxes;
        }

        public class Tile
        {
            public Tile()
            {
            }
            public string Boxart { get; set; }
            public Vector2 Position { get; set; }
            public int Collide { get; set; }
        }

        public class Boxes
        {
            public Boxes()
            {
            }
            public List<Tile> Tiles { get; set; }
        }
}

Mit dieser XML Datei funktioniert es.


<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:ns="Microsoft.Xna.Framework">
 <Asset Type="MyXMLData.MyLevel">
 	<LevelInfo>
   <LevelName>TestName</LevelName>
   <Background>Back_1</Background>
   <Worldsize>200 200</Worldsize>
   <Startpunkt>100 780</Startpunkt> 
  </LevelInfo>	
  <Boxes>
		  <Tiles Boxart="Mauer" Position="0 900 270 130" Collide="1" />
  </Boxes>
 </Asset>
</XnaContent>

Mit mehr Zeilen <Tiles .. /> leider nicht mehr. 😦


<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:ns="Microsoft.Xna.Framework">
 <Asset Type="MyXMLData.MyLevel">
 	<LevelInfo>
   <LevelName>TestName</LevelName>
   <Background>Back_1</Background>
   <Worldsize>200 200</Worldsize>
   <Startpunkt>100 780</Startpunkt> 
  </LevelInfo>	
  <Boxes>
		  <Tiles Boxart="Mauer" Position="0 900 270 130" Collide="1" />
          <Tiles Boxart="Mauer" Position="0 900 270 160" Collide="0" />
          <Tiles Boxart="Mauer" Position="0 900 270 190" Collide="1" />
          <Tiles Boxart="Mauer" Position="0 900 270 230" Collide="0" />
  </Boxes>
 </Asset>
</XnaContent>

Würde mich sehr freuen wenn mir jemand wieder auf die Sprünge helfen könnte.

LG

2.078 Beiträge seit 2012
vor 6 Jahren

Was funktioniert nicht?
Wie lädst Du die XML-Dateien?

Für mich siehen die Klassen aus, als würde der XmlSerializer das wunderbar automatisch können.
Zusammen mit den entsprechenden Attributen an den Properties kein Problem.

P
Piwi Themenstarter:in
4 Beiträge seit 2008
vor 6 Jahren

Hallo Palladin007!

Ich arbeite mit Monogame.
Wenn ich die XML Datei mit dem Pipeline Tool einfügen will bekomme ich folgende Fehlermeldung.
Zeile 12, Position 6 wäre praktisch die zweite <Tiles /> Zeile.

Wie gesagt, solange nur eine Zeile unter <Boxes> steht funktioniert es.

Geladen wird die XML Datei...
Level1 = Cont.Load<MyXMLData.MyLevel>("Level1");

Ich vermute hier das Problem.


        public class Tile
        {
            public Tile()
            {
            }
            public string Boxart { get; set; }
            public Vector2 Position { get; set; }
            public int Collide { get; set; }
        }

        public class Boxes
        {
            public Boxes()
            {
            }
            public List<Tile> Tiles { get; set; }
       }

Irgendwie schein hier nur eine Zeile gelesen werden zu können

Hinweis von MrSparkle vor 6 Jahren

Bitte keine externen FileHoster verwenden! Und Fehlermeldungen bitte als Text einfügen. Siehe auch [Hinweis] Wie poste ich richtig?

2.078 Beiträge seit 2012
vor 6 Jahren

Hm - ok, mit MonoGame kenne ich mich gar nicht aus, ich kann also nur raten.

Probier doch mal, anstatt
<Tiles Boxart="Mauer" Position="0 900 270 130" Collide="1" />
das
<Tiles Boxart="Mauer" Position="0 900 270 130" Collide="1"></Tiles>
zu schreiben

Ist nur eine Idee, vielleicht kommt der Parser damit nicht klar.

Denn:
Wenn Du mal in den StackStrace schaust, steht dort, dass die Exception bei der Methode System.Xml.XmlReader.ReadEndElement auftritt.
Du hast aber effektiv kein EndElement, es geht direkt mit dem nächsten StartElement weiter.

P
Piwi Themenstarter:in
4 Beiträge seit 2008
vor 6 Jahren

Leider hat das nicht geholfen. 🙁

Aber Du hast schon Recht, irgendwie erwartet er schon ein EndElement.

Ich vermute aber das er schon das EndElement von </Boxes> erwartet.
Weshalb auch immer, aber er will anscheinend nur eine Zeile einlesen.

Hmmm...

Aber danke für diesen Denkanstoß. 👍

16.806 Beiträge seit 2008
vor 6 Jahren

Das Element sollte Tile heissen und nicht Tiles.
Deine Klasse heisst schließlich auch Tile. Wundert mich überhaupt, dass das ohne entsprechendes Attribut nicht knallt, wenn der Klassenname nicht identisch ist.

Aber ja, der Serializer unter Mono hat Probleme bei XML-Dateien mit nicht ausgeschriebenem End-Tag.

Die hier gezeigten XML Dateien sind aber prinzipiell nach Standard valide.

3.003 Beiträge seit 2006
vor 6 Jahren

Müsste da nicht ein Tiles-Element mit beliebig vielen Tile-Subknoten sein?

Das Beispiel mit einem Tiles-Knoten liefert eine leere Liste in Boxes.Tiles, das mit mehreren ist invalid, weil Boxes ja nur eine Tiles-Property hat.

Benennung überdenken (TileList oder TileCollection statt Tiles), und/oder mit Attributen arbeiten.

LaTino
EDIT: autocorrect

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)