XML文件解析数据结构
最近在解析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文件解析数据结构的更多相关文章
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- android基础知识13:AndroidManifest.xml文件解析
注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...
- Android之AndroidManifest.xml文件解析
转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...
- 9.XML文件解析
一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...
- Python实现XML文件解析
1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web ...
- Python3将xml文件解析为Python对象
一.说明 从最开始写javascript开始,我就很烦感使用getElementById()等函数来获取节点的方法,获取了一个节点要访问其子孙节点要么child半天要么就再来一个getElementB ...
- XML文件解析-DOM4J方式和SAX方式
最近遇到的工作内容都是和xml内容解析相关的. 1图片数据以base64编码的方式保存在xml的一个标签中,xml文件通过接口的方式发送给我,然后我去解析出图片数据,对图片进行进一步处理. 2.xml ...
- java基础之概谈xml文件解析
XML已经成为一种非常通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便. 诸多web应用框架,其可配置的编程方式,给我们的开发带来了非常大程度的便捷,但细细 ...
随机推荐
- C#设计模式之十九状态模式(State Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第六个模式,该模式是[状态模式],英文名称是:State Pattern.无论是现实世界,还是面向对象的OO世界,里面都有一个东西, ...
- 阿里安全潘多拉实验室首先完美越狱苹果iOS 11.2
苹果官方对iOS 11的评价是"为iPhone带来巨大进步,让iPad实现里程碑式飞跃."但为了不断修复Bug,苹果于12月2日推出最新的iOS 11.2,修复了Google安全人 ...
- 分享Sql Server 2008 r2 数据备份,同步服务器数据(一.本地备份)
最近在部署一个系统,处于数据安全的考虑,因此对相应的数据库服务器定时备份,以及数据同步到备份服务上.之前在另外的一个项目中也做过相应的操作,但是操作都是按照查找到的文章一步一步的操作,碰到一些细节问题 ...
- javascript设计模式——适配器模式
前面的话 适配器模式的作用是解决两个软件实体间的接口不兼容的问题.使用适配器模式之后,原本由于接口不兼容而不能工作的两个软件实体可以一起工作.适配器的别名是包装器(wrapper),这是一个相对简单的 ...
- Sun 与 Oracle 合并的未来
引言 SUN 2008 初 10 亿美元收购 MySQL Oracle 2009 年 4 月 74 亿美元收购 SUN Sun 与 Oracle 合并的未来 1,如果云计算对企业来说变得越来越重要,那 ...
- 实践作业3:白盒测试----我是如何写测试用例DAY6
一开始接到写白盒测试的任务,我感觉挺难的,因为感觉之前我所想到的都是黑盒测试啊,说到测试系统逻辑,感觉就有些神秘的样子没有思路了,那黑盒和白盒写的到底有啥区别.后来我请教了实验室的一个同学,他虽然还没 ...
- backbone与require的共存问题解决
如果向下面那样直接列出script标签可能会出现错误, <script type="text/javascript" src="/dep/jquery-1.11 ...
- Python开发工具PyCharm个性化设置
Python开发工具PyCharm个性化设置,包括设置默认PyCharm解析器.设置缩进符为制表符.设置IDE皮肤主题等,大家参考使用吧 1.设置默认PyCharm解析器: 操作如下: Pyt ...
- MyEclipse激活步骤
1.前言: MyEclipse 成功安装后使用天数仅仅有30天,打开软件后常常会弹出提醒我们在5天内要激活的对话框.没有激活的话,时间一到就不能使用了. 众所周知,中国的软件是不用花钱的,这里就介 ...
- [开源项目] Android校验库 - FireEye
简单易用的Android校验库. 这是一个简单Android校验库,按配置来验证用户输入的表单信息. 仅仅须要几行代码,就可以验证用户输入,而且将验证错误反馈给用户. 它内置了大量经常使用的验证类型, ...