首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 解析 XML 數據提取指南:DOM4J 替代方案與 XmlPullParser 原生實現

     編輯:程式設計綜合問答

需求:解析特定格式 XML,提取 Animation 屬性、Module 幾何數據、Frame/Sprite 變換矩陣、Action/Sequence 時長等。

XML 結構分析

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

方案一:XmlPullParser (Android 原生、輕量、流式、推薦)

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

方案二:DOM4J (功能豐富、但 Android 6.0+ 需額外依賴、內存佔用大)

// 需添加依賴: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,零依賴、流式解析、內存友好、性能最優。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved