2016-07-29 16 views
0

Also arbeite ich an meinem Spiel in Unity, und ich stieß auf ein Problem in Bezug auf XML. Ich habe ein System eingerichtet, dank eines Tutorials, mit dem ich Elemente erstellen kann, indem ich ihre Daten aus einer XML-Datenbank lese. Aber es gibt ein Problem. Ich möchte, dass meine XML-Datei einzurichten lesen sich wie folgt:.XML-Serialisierung in Unity - Haben ein Array verschiedene Array-Elemente?

 <resistance> 
      <physical> 
       <phy>60.0</phy> 
      </physical> 

      <air> 
       <air>50.0</air> 
      </air> 
     </resistance> 

Ich habe jedoch keine Möglichkeit zum Einstellen der als Wurzel zu prüfen, um die Daten in

Das Format der XML gefunden Datei ist wie folgt:

<Item> 
     <id>0</id> 
     <name>Helmet</name> 
     <resistance> 
      <physical> 
       <phy>60.0</phy> 
      </physical> 

      <air> 
       <air>50.5</air> 
      </air> 
     </resistance> 
    </Item> 

[XmlArray ("Widerstand"), XmlArrayItem ("physical")] nur den Teil liest. Ich habe auch versucht zu schreiben alles wie folgt:

[XmlArray("resistance"), XmlArrayItem("physical"), XmlArrayItem("phy")] 
public float[] phyres; 
[XmlArray("air"), XmlArrayItem("air")] 
public float[] airres; 

Aber die XML-Datei dann bekam chaotisch, obwohl die Daten gelesen wurde, und ich habe die richtigen Widerstände, was nach dem folgte, war nicht gelesen, als wenn der Widerstand der neuen wurde Permanente Wurzel der XML-Datei. Vielen Dank im Voraus.

Bearbeiten: Mit anderen Worten, ich möchte ein Subroot in meinem Kind haben, und halten Sie ein paar verschiedene Arrays dort.

Edit: Edit: Danke jdweng Sie sind, diese am Ende einfacher zu schreiben:

[XmlElement("resistance"), XmlArrayItem("physical")] 
public float[] phyres; 
[XmlElement("air")] 
public float[] airres; 

Aber ich immer noch das gleiche Problem bekommen. Der Root/Namespace ist auf gesetzt, und danach wird alles aus diesem Namespace gelesen. Nicht einmal das Nachher beeinflusst es.

+0

ändern XmlArray zu XmlElement. XmlElement funktioniert mit Arrays und eliminiert eine Ebene unnötiger Tags. – jdweng

+0

@jdweng Scheint, als ob ich das gleiche Ergebnis wie das letzte Code-Snippet bekomme. Der Stamm ändert sich zu diesem Element und alle Elemente danach werden in gesucht. Wie würde ich nach dem Lesen der Daten vom Widerstandselement die Wurzel zurück auf wiederherstellen? – lightingft

+0

Sie müssen den Widerstand entweder mit XML (s) oder in Ihren Klassen hinzufügen. – jdweng

Antwort

0

Wie ich es gelesen habe, ist Ihre Anforderung ein resistance Element, das ein physical und ein air Element enthält. Dies ist:

[XmlElement("resistance"), XmlArrayItem("physical")] 
public float[] phyres; 
[XmlElement("air")] 
public float[] airers; 

Das repräsentiert das nicht. Es beinhaltet ein resistance Element, das mehrere Elemente enthält, gefolgt von ein air Element.

Hier ist eine Klassenstruktur, die die XML-Spiegel:

public class Item 
{ 
    [XmlElement("id")] 
    public int Id { get; set; } 

    [XmlElement("name")] 
    public string Name { get; set; } 

    [XmlElement("resistance")] 
    public Resistance Resistance { get; set; } 
} 

public class Resistance 
{ 
    [XmlArray("physical")] 
    [XmlArrayItem("phy")] 
    public float[] Phyres { get; set; } 

    [XmlArray("air")] 
    [XmlArrayItem("air")] 
    public float[] Air { get; set; } 
} 
+0

Ahh ja, ich habe über diese Methode nachgedacht, zögerte aber, es zu versuchen. Auch wenn ich dies nicht mehr benötige, wird dies in Zukunft sehr nützlich sein. Vielen Dank! – lightingft

Verwandte Themen