2012-09-03 8 views
1

Je veux lire XML comme ceci.Utiliser Xml pour créer une liste

<?xml version="1.0" encoding="utf-8" ?> 
<parent> 
    <path> 
    <pathPoints> 
    <point> 
     2 0 
     </point> 
     <point> 
     2 1 
     </point> 
     3 1 
     <point> 
     3 2 
     </point> 
     <point> 
     4 2 
     </point> 
     <point> 
     4 4 
     </point> 
     <point> 
     3 4 
     </point> 
     <point> 
     3 5 
     </point> 
     <point> 
     2 5 
     </point> 
     <point> 
     2 7 
     </point> 
     <point> 
      7 7 
     </point> 
     <point> 
      7 5 
     </point> 
     <point> 
     10 5 
     </point> 
     <point> 
     10 2 
     <point> 
     </point> 
     15 2 
     </point> 
     <point> 
     15 6 
     </point> 
     <point> 
     16 6 
     </point> 
     <point> 
     16 7 
     </point> 
     <point> 
     17 7 
     </point> 
     <point> 
     17 10 
     </point> 
     <point> 
     19 10 
     </point> 
    </pathPoints> 
    </parent> 
</path> 

Et maintenant, je suis en train de le lire:

 paths = (from path in doc.Descendants("path") 
       select new AIPath() 
       { 
        waypoints = (from i in path.Descendants("pathPoints") 
        { 
         int j = Convert.ToInt32(i.Element("point").Value), 
        }).ToList(); 
       } 
       ).ToList(); 

Mon AIPath contient une liste de points de cheminement appelé de Vecteur2.

Ce que je veux savoir, c'est ce que je fais de mal. Je veux créer un nouveau chemin chaque fois qu'il change le chemin qu'il regarde, ce qui semble bien. Ce que je suis confus au sujet de waht est à faire ensuite. Après les points de passage = (de i à path.Descendants (« PathPoints »), je prévois que je dois faire quelque chose, mais je ne suis aucune idée de quoi.

Toute aide serait grandement appréciée.

.. éditer

Un ou deux détails que j'oublié d'ajouter

public class AIPath 
{ 
    //public Vector2 
    public List<Vector2> waypoints { get; set; } 
    public int linkNumber { get; set; } 
    public int[] potentialLinks { get; set; } 
} 
+0

Nous ne savons pas ce que votre 'type AIPath' ressemble, ce qui le rend difficile à aider. De plus, vous ne nous avez pas dit ce que votre code * courant * fait. (Il semble que ce soit fondamentalement une erreur de syntaxe ...) –

+0

En outre, vous semblez actuellement essayer d'analyser un élément 'point' comme un entier * simple *, quand il contient clairement * deux * entiers. Êtes-vous capable de changer le format XML? On dirait que ce serait beaucoup plus propre si les deux valeurs étaient définies comme attributs des éléments 'point' ... –

+0

@JonSkeet oui je peux changer le format et j'ai besoin de X et Y. C'était plus pour illustrer J'ai déjà fait J'ai ajouté ma classe de chemin AI. Cela ne fonctionne pas pour le moment car je ne peux pas déterminer ce que j'ai besoin d'ajouter pour dire à l'analyseur xml d'ajouter tous les éléments de points de cheminement qu'il trouve dans la table de points de cheminement AIPath. – Bushes

Répondre

1

Actuellement, votre sortie XML est relativement difficile à analyser, je réécrire votre code comme ceci:

public sealed class AIPath 
{ 
    // TODO: Consider trying to make this immutable, or 
    // at least not exposing the collections so widely. Exposing an array 
    // property is almost always a bad idea. 
    public List<Vector2> Waypoints { get; set; } 
    public int LinkNumber { get; set; } 
    public int[] PotentialLinks { get; set; } 

    public XElement ToElement() 
    { 
     return new XElement("path", 
      WayPoints.Select(v2 => new XElement("point", 
             new XAttribute("X", (int) v2.X), 
             new XAttribute("Y", (int) v2.Y)))); 
    } 

    public static AIPath FromXElement(XElement path) 
    { 
     return new AIPath 
     { 
      WayPoints = path.Elements("point") 
          .Select(p => new Vector2((int) p.Attribute("X"), 
                (int) p.Attribute("Y"))) 
          .ToList(); 
     }; 
    } 
} 

Puis:

paths = doc.Descendants("path") 
      .Select(x => AIPath.FromXElement(x)) 
      .ToList(); 
+0

Ok, je vais essayer. Merci beaucoup. – Bushes

1

réponse Jon Skeet ne fonctionnera probablement, mais le cadre XNA offre un moyen beaucoup plus facile de lire XML dans vos objets à travers le pipeline de contenu.

Exemple XML:

<?xml version="1.0" encoding="utf-8"?> 
<XnaContent> 
    <Asset Type="MyDataTypes.CatData[]"> 
    <Item> 
     <Name>Rhys</Name> 
     <Weight>17</Weight> 
     <Lives>9</Lives> 
    </Item> 
    <Item> 
     <Name>Boo</Name> 
     <Weight>11</Weight> 
     <Lives>5</Lives> 
    </Item> 
    </Asset> 
</XnaContent> 

Exemple Classe:

namespace MyDataTypes 
{ 
    public class CatData 
    { 
     public string Name; 
     public float Weight; 
     public int Lives; 
    } 
} 

Construit dans importateur XML et processeur du Content Pipeline associera les éléments XML avec les membres de la classe correctement nommés lors de la construction du. Les fichiers xnb supposent que vous avez correctement marqué l'élément Asset Type.

Voir: http://msdn.microsoft.com/en-us/library/ff604981.aspx

+0

L'utilisation de [XmlAttribute] 'et [[XmlElement]' est également utile si vous voulez plus de contrôle sur la sérialisation de vos fichiers XML par des noms d'éléments/attributs. –

Questions connexes