Java XML 解析器复制列表中的元素

问题描述 投票:0回答:2

我有一个 SAX2 XML 解析器,我想执行特定的操作。

  1. 在frame元素开始时添加一个对象到
    tileFrames
    列表(与每个动画元素中的frame一样多),
  2. 当动画元素结束时,用这个
    currentTileID
    列表添加字符串
    tileFrames
  3. 在动画开始时清除
    tileFrames
    列表,以便
    tileAnimations
    列表接收其元素,而没有专用于另一个动画元素的元素。

只要我的 xml 文件中没有更多动画标签,我就希望这个场景能够执行。

现在我收到具有正确

currentTileID
但具有相同元素的对象列表,就像上次动画迭代一样。

这是我登录时得到的:

2023-04-16 14:07:30.538 25714-25714/abc.def.ghi D/tile_animations: TileAnimation{localGID=21, tileFrames=[TileFrame{tileId=42, duration=500}, TileFrame{tileId=43, duration=500}]}
2023-04-16 14:07:30.538 25714-25714/abc.def.ghi D/tile_animations: TileAnimation{localGID=22, tileFrames=[TileFrame{tileId=42, duration=500}, TileFrame{tileId=43, duration=500}]}
2023-04-16 14:07:30.538 25714-25714/abc.def.ghi D/tile_animations: TileAnimation{localGID=43, tileFrames=[TileFrame{tileId=42, duration=500}, TileFrame{tileId=43, duration=500}]}
(...)

这里是关键代码(如果我砍掉太多代码我会附上更多,我只是想简化事情):

TmxHandler.java

@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    if (localName.equals("animation")) {
        tileFrames.clear();

    } else if (localName.equals("frame")) {
        tileFrames.add(new TileFrame(Long.parseLong(atts.getValue("tileid")), Long.parseLong(atts.getValue("duration"))));

    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName) {
     if (localName.equals("animation")) {
        currentTileSet.tileAnimations.add(new TileAnimation(Long.parseLong(currentTileID), tileFrames));


    } else if (localName.equals("frame")) {

    } 
}

TileAnimation.java

public class TileAnimation {

private long localGID;
private List<TileFrame> tileFrames;

public long getLocalGID() {
    return localGID;
}

public void setLocalGID(long localGID) {
    this.localGID = localGID;
}

public List<TileFrame> getTileFrames() {
    return tileFrames;
}

public void setTileFrames(List<TileFrame> tileFrames) {
    this.tileFrames = tileFrames;
}

public TileAnimation(long localGID, List<TileFrame> tileFrames) {
    this.localGID = localGID;
    this.tileFrames = tileFrames;
}

@Override
public String toString() {
    return "TileAnimation{" +
            "localGID=" + localGID +
            ", tileFrames=" + tileFrames +
            '}';
}

}

这是我的 xml

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.0" orientation="orthogonal" renderorder="right-down" width="8" height="12" tilewidth="32" tileheight="32" infinite="0" nextlayerid="11" nextobjectid="1">
 <tileset firstgid="1" name="RPG Nature Tileset" tilewidth="32" tileheight="32" tilecount="180" columns="20">
  <image source="NatureTileset.png" width="641" height="288"/>
  <tile id="21">
   <animation>
    <frame tileid="21" duration="1000"/>
    <frame tileid="1" duration="1000"/>
    <frame tileid="20" duration="1000"/>
   </animation>
  </tile>
  <tile id="22">
   <animation>
    <frame tileid="22" duration="100"/>
    <frame tileid="2" duration="100"/>
   </animation>
  </tile>
  <tile id="43">
   <animation>
    <frame tileid="42" duration="500"/>
    <frame tileid="43" duration="500"/>
   </animation>
  </tile>
 </tileset>
 <tileset firstgid="181" name="32x32_map_tile v3.1 [MARGINLESS]" tilewidth="32" tileheight="32" tilecount="667" columns="23">
  <image source="32x32_map_tile v3.1 [MARGINLESS].png" width="736" height="928"/>
 </tileset>
 <layer id="1" name="grass" width="8" height="12">
  <data encoding="csv">
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41,
41,41,142,142,142,142,41,41,
41,41,142,41,142,41,41,41,
41,41,41,142,142,41,41,41,
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41,
41,41,41,41,41,41,41,41
</data>
 </layer>
 <layer id="9" name="anim1" width="8" height="12">
  <data encoding="csv">
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,23,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,44,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
</data>
 </layer>
 <layer id="10" name="anim2" width="8" height="12">
  <data encoding="csv">
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,22,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0
</data>
 </layer>
</map>

如果你需要更多的东西就问。

java android xml sax tmx
2个回答
0
投票

屏幕 颜色深度: 24 像素深度: 24 高度: 820 宽度: 360 可用高度: 820 可用宽度: 360 可用性顶部: 0 可用左: 0 窗口大小: 360x3598 (360x820) 插件 缺少插件 扩展 网页GL: 076f790265bc8796 帆布: -151063313 声音的: 8fb5fa54c9d5e0c0 字体: 202a809ae5defaa7 客户端矩形: da39a3ee5e6b4b0d 时间 区: 非洲/拉各斯 当地的: 2023 年 4 月 15 日星期六 00:44:44 GMT-0600(中部标准时间) 系统: 2023 年 4 月 16 日星期日 06:08:19 GMT-0600(中部标准时间) 知识产权 WEBRTC 104.28.155.240 JavaScript 启用 闪光 残疾人 活性剂 残疾人 JAVA 残疾人 饼干loxked209.85.255.255 启用


0
投票
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
    if (localName.equals("animation")) {
        // Do nothing
    } else if (localName.equals("frame")) {
        tileFrames.add(new TileFrame(Long.parseLong(atts.getValue("tileid")), Long.parseLong(atts.getValue("duration"))));
    }
}

@Override
public void endElement(String namespaceURI, String localName, String qName) {
    if (localName.equals("animation")) {
        currentTileSet.tileAnimations.add(new TileAnimation(Long.parseLong(currentTileID), new ArrayList<>(tileFrames)));
        tileFrames.clear();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.