首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果属于layer1的xml标记和属于layer2的xml标记使用相同的标记名,如何区分它们?

如果属于layer1的xml标记和属于layer2的xml标记使用相同的标记名,如何区分它们?
EN

Stack Overflow用户
提问于 2010-07-01 17:09:23
回答 2查看 225关注 0票数 0

在我xml文件中,

我在不同的地方(layer1和layer2)使用相同的标记名,

如何区分名为"<tile gid ="int">“的标签与layer1和layer2?

我需要根据它们是属于layer1还是layer2来对它们进行不同的处理。

下面是我的解析器和xml文件的一个小示例:

代码语言:javascript
复制
// =================
// 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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-01 19:27:54

您的解析器代码必须记住在发生tile标记的START_TAG事件时它当前所在的层。

要做到这一点,一种方法是创建一个字段String currentLayer;,并在代码中的某处包含类似于

代码语言:javascript
复制
if (xrp.getEventType() == XmlResourceParser.END_TAG) 
{
  String s = xrp.getName();
  if (s.equals("layer")) 
  {
    currentLayer = null;  // or something ...
  }
}

代码语言:javascript
复制
if (xrp.getEventType() == XmlResourceParser.START_TAG) 
{
  String s = xrp.getName();
  if (s.equals("layer")) 
  {
    currentLayer = xrp.getAttributeValue(null, "name", 0);
  }
}

然后,在处理tile标记的代码中,您将使用该字段来决定对类似以下内容采取的操作

代码语言:javascript
复制
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构造时,但这可能会让您开始。

一种更好的方法可能是为处理tiles的委托设置一个字段,在layer标记的开始事件处理期间将其设置为适当的“tiles-processor”对象(您必须将其定义为一个单独的类),并在处理tiles标记时使用它。但这很难放入代码片段中。

票数 0
EN

Stack Overflow用户

发布于 2010-07-01 17:23:54

免责声明:我对安卓一无所知,但通常这种情况很适合XML namespaces

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3156399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档