Как отличить теги XML, которые относятся к layer1 и те, которые принадлежат layer2, если они используют одно и то же имя тега? - PullRequest
0 голосов
/ 01 июля 2010

в моем XML-файле,
у меня есть одно и то же имя тега, используемое в другом месте (layer1 и layer2),
как я могу отличить теги с именем "<tile gid ="int">" от layer1 и layer2?
мне нужно обрабатывать их по-разному в зависимости от того, принадлежат ли они к layer1 или layer2 ...
Вот небольшой пример моего парсера и моего файла 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>

Ответы [ 2 ]

0 голосов
/ 01 июля 2010

Ваш код парсера должен будет помнить, в каком виде он находится в данный момент во время события START_TAG для тега плитки.

Один из способов сделать это - создать поле String currentLayer; и где-нибудь ещев вашем коде есть сегменты кода, напоминающие

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

и

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

Затем в вашем коде, имеющем дело с тегом тайла, вы будете использовать это поле, чтобы решить, какое действие предпринять с чем-либо

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.
    }
  }
}

Это не обязательно лучший подход, особенно если он приводит к огромным вложенным конструкциям if-else, но это может помочь вам начать работу.

Лучшим подходом может быть использованиеполе для делегата, который обрабатывает тайлы, задайте ему соответствующий объект «процессор-тайл» (который вы должны будете определить как отдельный класс) во время обработки начального события для тега слоя и используйте его при обработкетег плитки.Но сложнее вставить фрагменты кода.

0 голосов
/ 01 июля 2010

Отказ от ответственности: ничего не знаю об Android, но обычно такая ситуация подходит для пространств имен XML

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...