最近在解析Android安装包内经过编译的二进制XML文件时想在内存中建立起其对应的树结构。

想了一早晨,思路如下图。

多叉树中的每个节点除了有子节点和兄弟节点以外还有一个指针指向父节点,然后根据状态转移图执行相应的代码就行。

public void main() {
XmlTagTree tree = new XmlTagTree();
while (true) {
// 获取xml标签
Tag tag = getTag();
if (tag.isStartTag()) {
tree.addNode(tag, XmlTagTree.STATE_START);
} else if (tag.isEndTag()){
tree.addNode(null, XmlTagTree.STATE_END);
}
}
} class Tag {
private Tag parent;
private Tag child;
private Tag next;
} class XmlTagTree { public final static int STATE_START = 0;
public final static int STATE_END = 1; private int mCurrentState = STATE_START;
private Tag mRoot;
private Tag mCurrent;
private XmlTreeOperate[][] mOperates;
private int mSize = 0; public XmlTagTree() {
mOperates = new XmlTreeOperate[2][2];
mOperates[STATE_START][STATE_START] = new XmlTreeOperate() {
@Override
public void operate(Tag chunk, int state) {
if (mRoot == null) {
// 第一次操作,初始化节点
mRoot = chunk;
mCurrent = chunk;
} else {
// (START, START) -> addChild
mCurrent.child = chunk;
chunk.parent = mCurrent;
mCurrent = chunk;
++mSize;
}
}
};
mOperates[STATE_START][STATE_END] = new XmlTreeOperate() {
@Override
public void operate(Tag chunk, int state) {
// (START, END) -> none
// do not do anything
}
};
mOperates[STATE_END][STATE_START] = new XmlTreeOperate() {
@Override
public void operate(Tag chunk, int state) {
// (END, START) -> addSibling
mCurrent.next = chunk;
chunk.parent = mCurrent.parent;
mCurrent = chunk;
++mSize;
}
};
mOperates[STATE_END][STATE_END] = new XmlTreeOperate() {
@Override
public void operate(Tag chunk, int state) {
// (END, END) -> goParent
mCurrent = mCurrent.parent;
}
};
} public void addNode(Tag chunk, int state) {
if (mRoot == null && state != STATE_START) {
throw new RuntimeException("first state in XmlTagTree must be STATE_START");
}
mOperates[mCurrentState][state].operate(chunk, state);
mCurrentState = state;
} private interface XmlTreeOperate {
void operate(Tag chunk, int state);
}
}

XML文件解析数据结构的更多相关文章

  1. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  2. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  3. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

  4. Android之AndroidManifest.xml文件解析

    转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...

  5. 9.XML文件解析

    一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...

  6. Python实现XML文件解析

    1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...

  7. Python3将xml文件解析为Python对象

    一.说明 从最开始写javascript开始,我就很烦感使用getElementById()等函数来获取节点的方法,获取了一个节点要访问其子孙节点要么child半天要么就再来一个getElementB ...

  8. XML文件解析-DOM4J方式和SAX方式

    最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...

  9. java基础之概谈xml文件解析

    XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...

随机推荐

  1. Linux多线程编程详细解析----条件变量 pthread_cond_t

    Linux操作系统下的多线程编程详细解析----条件变量 1.初始化条件变量pthread_cond_init #include <pthread.h> int pthread_cond_ ...

  2. 安装phpnow服务[Apache_pn]提示失败的解决方法

    win 7/win 8/Win10 phpnow提示"安装服务[Apache_pn]失败"错误解决办法汇总 常常在安装phpnow的时候,提示"安装服务 [ Apache_pn ] 失败&q ...

  3. 分布式文件系统及FastDFS

    1.前言 今天来谈谈分布式文件系统,侧重点是文件系统,分布式稍微带一下.然后聊下我用的FastDFS的例子. 2.从小需求开始 我的博客的编辑器用的是markdown,它内嵌了一个文件上传功能,不过后 ...

  4. Tomcat下载,新建自己的项目,模拟server

    一.tomcat下载 下载地址http://tomcat.apache.org/ 打开网页能够看到例如以下内容 在网页左边有Download以下就是能够下载的版本号.如6.0,7.0,8.0: 选择一 ...

  5. Android binder学习一:主要概念

    要看得懂android代码,首先要了解binder机制.binder机制也是android里面比較难以理解的一块,这里记录一下binder的重要概念以及实现.作为备忘. 部分内容来源于网上,如有侵权. ...

  6. redmine工作流程总结

    1.需求调研员和測试员新建问题,问题跟踪为支持,指派给产品经理 2.产品经理对收到的问题进行分类处理,功能类型的,改动跟踪状态为功能,指派给自己.是bug类型的,将跟踪类型改动错误类型,指派给技术经理 ...

  7. LeetCode OJ 之 Ugly Number II (丑数-二)

    题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...

  8. Xcode 7.0 官方免费的真机开发

    Xcode 7.0 官方免费的真机开发 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ...

  9. 被动式Telnet研究及实现(解决内外网远程维护的困难)-part A

    欢迎转载.转载请保留原文链接:http://blog.csdn.net/mikulee/article/details/40149779 项目背景及需求: 近期公司有一个项目: 我们在一个arm主机上 ...

  10. JavaSe: String的编译期优化

    Java的编译期优化 因为工作的原因,经常会在没有源码的情况下,对一些产品的代码进行阅读.有时在解决Bug时,在运行环境下会直接去看class文件的字节码,来确定运行中版本是否正确的. 在看字节码时, ...