0 votes

comment différencier les balises xml qui appartiennent à la couche 1 et celles qui appartiennent à la couche 2 si elles utilisent le même nom de balise ?

Dans mon fichier xml,
J'ai le même nom de balise utilisé à différents endroits (couche 1 et couche 2),
comment puis-je différencier les balises nommées " <tile gid ="int"> " de la couche 1 et de la couche 2 ?
Je dois les traiter différemment selon qu'ils appartiennent à la couche 1 ou à la couche 2...
voici un petit échantillon de mon analyseur et de mon fichier xml :

// =================
// xml parser sample
// =================
XmlResourceParser xrp = (XmlResourceParser) ctx.getResources().getXml(R.xml.castle);
  while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) 
  {
    if (xrp.getEventType() == XmlResourceParser.START_TAG) 
    {
      String s = xrp.getName();
      if (s.equals("tile")) 
      {
        int a = xrp.getAttributeIntValue(null, "gid", 0);
        // process a
      }
    }
  }

// ===============
// xml file sample:
// ===============
<layer name="layer1">
  <data>
    <tile gid="1"/>
    <tile gid="2"/>
    ...
  </data>
</layer>
<layer name="layer2">
  <data>
    <tile gid="1"/>
    <tile gid="2"/>
    ...
  </data>
</layer>

0voto

Clause de non-responsabilité : je ne connais rien à Android, mais en général, ce genre de situation convient bien à Espaces de noms XML

0voto

Don Roby Points 24965

Le code de votre analyseur devra se souvenir du type de couche dans lequel il se trouve au moment de l'événement START_TAG pour une étiquette de tuile.

Une façon de le faire est de créer un champ String currentLayer; et quelque part dans votre code, vous avez des segments de code ressemblant à

if (xrp.getEventType() == XmlResourceParser.END_TAG) 
{
  String s = xrp.getName();
  if (s.equals("layer")) 
  {
    currentLayer = null;  // or something ...
  }
}

y

if (xrp.getEventType() == XmlResourceParser.START_TAG) 
{
  String s = xrp.getName();
  if (s.equals("layer")) 
  {
    currentLayer = xrp.getAttributeValue(null, "name", 0);
  }
}

Ensuite, dans votre code traitant de la balise tile, vous utiliserez ce champ pour décider de l'action à entreprendre avec quelque chose ressemblant à

if (xrp.getEventType() == XmlResourceParser.START_TAG) 
{
  String s = xrp.getName();
  if (s.equals("tile")) 
  {
    int a = xrp.getAttributeIntValue(null, "gid", 0);
    if ("layer1".equals(currentLayer) {
        // process layer1 tile.
    }
    else if ("layer2".equals(currentLayer) {
        // process layer2 tile.
    }
    else {
        // handle occurrence of tile outside layer.
    }
  }
}

Ce n'est pas nécessairement la meilleure approche, surtout si elle conduit à d'énormes constructions if-else imbriquées, mais cela peut vous aider à démarrer.

Une meilleure approche pourrait être d'avoir un champ pour un délégué qui gère les tuiles, de le définir sur un objet "tile-processor" approprié (que vous devrez définir comme une classe séparée) pendant le traitement de l'événement de démarrage pour la balise de couche et de l'utiliser dans le traitement de la balise de tuile. Mais c'est plus difficile à exprimer en extraits de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X