需求:解析特定格式 XML,提取 Animation 屬性、Module 幾何數據、Frame/Sprite 變換矩陣、Action/Sequence 時長等。
<Animation image="..." version="4">
<Modules><Module h="135" w="407" x="0" y="0"/></Modules>
<Frames>
<Frame ... name="untitled1">
<Sprite m00="1.0" m10="0.0" m01="0.0" m11="1.0" m02="-208.0" m12="-112.0" module_id="0"/>
</Frame>
</Frames>
<Actions>
<Action name="untitled1">
<Sequence duration="1" flag="0" id="0"/>
<MechModel flag="0" vx="0" vy="0" ax="0" ay="0"/>
</Action>
</Actions>
</Animation>
public AnimationData parse(InputStream in) throws XmlPullParserException, IOException {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(in, "UTF-8");
AnimationData data = new AnimationData();
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String tag = parser.getName();
switch (tag) {
case "Animation":
data.image = parser.getAttributeValue(null, "image");
data.version = parser.getAttributeInt(null, "version", 0);
break;
case "Module":
data.modules.add(new Module(
parser.getAttributeInt(null, "h", 0),
parser.getAttributeInt(null, "w", 0),
parser.getAttributeInt(null, "x", 0),
parser.getAttributeInt(null, "y", 0)
));
break;
case "Sprite":
data.sprites.add(new Sprite(
parser.getAttributeFloat(null, "m00", 0),
parser.getAttributeFloat(null, "m10", 0),
parser.getAttributeFloat(null, "m01", 0),
parser.getAttributeFloat(null, "m11", 0),
parser.getAttributeFloat(null, "m02", 0),
parser.getAttributeFloat(null, "m12", 0),
parser.getAttributeInt(null, "module_id", 0)
));
break;
case "Sequence":
data.sequences.add(new Sequence(
parser.getAttributeInt(null, "duration", 0),
parser.getAttributeInt(null, "flag", 0),
parser.getAttributeInt(null, "id", 0)
));
break;
}
}
eventType = parser.next();
}
return data;
}
// 需添加依賴:implementation 'org.dom4j:dom4j:2.1.3'
// 注意:Android 8.0+ 需處理 JAXP 兼容性,建議改用 PullParser
SAXReader reader = new SAXReader();
Document doc = reader.read(inputStream);
Element root = doc.getRootElement();
String image = root.attributeValue("image");
List modules = root.element("Modules").elements("Module");
for (Element m : modules) {
int h = m.attributeValue("h") != null ? Integer.parseInt(m.attributeValue("h")) : 0;
// ...
}
| 場景 | 推薦 |
|---|---|
| Android App、大文件、性能敏感 | XmlPullParser |
| 服務端/桌面、複雜 XPath 查詢、文檔修改 | DOM4J / JDOM2 |
| Kotlin 項目 | kotlinx-serialization + XmlPullParser 封裝 |
class AnimationData {
String image; int version;
List modules = new ArrayList<>();
List sprites = new ArrayList<>();
List sequences = new ArrayList<>();
}
class Module { int h, w, x, y; }
class Sprite { float m00,m10,m01,m11,m02,m12; int moduleId; }
class Sequence { int duration, flag, id; }
優先使用 Android 原生 XmlPullParser,零依賴、流式解析、內存友好、性能最優。