Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
XML Datei richtig in eine List<structur> laden.
Piwi
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

XML Datei richtig in eine List<structur> laden.

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.583
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Piwi
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Piwi am .
Attachments

Moderationshinweis von MrSparkle (30.09.2017 - 17:52)

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

private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Member

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.583
Herkunft: Düsseldorf

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 5 mal editiert, zum letzten Mal von Palladin007 am .
private Nachricht | Beiträge des Benutzers
Piwi
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

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ß.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.510

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers