在我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>发布于 2010-07-01 19:27:54
您的解析器代码必须记住在发生tile标记的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);
}
}然后,在处理tile标记的代码中,您将使用该字段来决定对类似以下内容采取的操作
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标记时使用它。但这很难放入代码片段中。
发布于 2010-07-01 17:23:54
免责声明:我对安卓一无所知,但通常这种情况很适合XML namespaces
https://stackoverflow.com/questions/3156399
复制相似问题