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

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

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

  1. public void main() {
  2. XmlTagTree tree = new XmlTagTree();
  3. while (true) {
  4. // 获取xml标签
  5. Tag tag = getTag();
  6. if (tag.isStartTag()) {
  7. tree.addNode(tag, XmlTagTree.STATE_START);
  8. } else if (tag.isEndTag()){
  9. tree.addNode(null, XmlTagTree.STATE_END);
  10. }
  11. }
  12. }
  13.  
  14. class Tag {
  15. private Tag parent;
  16. private Tag child;
  17. private Tag next;
  18. }
  19.  
  20. class XmlTagTree {
  21.  
  22. public final static int STATE_START = 0;
  23. public final static int STATE_END = 1;
  24.  
  25. private int mCurrentState = STATE_START;
  26. private Tag mRoot;
  27. private Tag mCurrent;
  28. private XmlTreeOperate[][] mOperates;
  29. private int mSize = 0;
  30.  
  31. public XmlTagTree() {
  32. mOperates = new XmlTreeOperate[2][2];
  33. mOperates[STATE_START][STATE_START] = new XmlTreeOperate() {
  34. @Override
  35. public void operate(Tag chunk, int state) {
  36. if (mRoot == null) {
  37. // 第一次操作,初始化节点
  38. mRoot = chunk;
  39. mCurrent = chunk;
  40. } else {
  41. // (START, START) -> addChild
  42. mCurrent.child = chunk;
  43. chunk.parent = mCurrent;
  44. mCurrent = chunk;
  45. ++mSize;
  46. }
  47. }
  48. };
  49. mOperates[STATE_START][STATE_END] = new XmlTreeOperate() {
  50. @Override
  51. public void operate(Tag chunk, int state) {
  52. // (START, END) -> none
  53. // do not do anything
  54. }
  55. };
  56. mOperates[STATE_END][STATE_START] = new XmlTreeOperate() {
  57. @Override
  58. public void operate(Tag chunk, int state) {
  59. // (END, START) -> addSibling
  60. mCurrent.next = chunk;
  61. chunk.parent = mCurrent.parent;
  62. mCurrent = chunk;
  63. ++mSize;
  64. }
  65. };
  66. mOperates[STATE_END][STATE_END] = new XmlTreeOperate() {
  67. @Override
  68. public void operate(Tag chunk, int state) {
  69. // (END, END) -> goParent
  70. mCurrent = mCurrent.parent;
  71. }
  72. };
  73. }
  74.  
  75. public void addNode(Tag chunk, int state) {
  76. if (mRoot == null && state != STATE_START) {
  77. throw new RuntimeException("first state in XmlTagTree must be STATE_START");
  78. }
  79. mOperates[mCurrentState][state].operate(chunk, state);
  80. mCurrentState = state;
  81. }
  82.  
  83. private interface XmlTreeOperate {
  84. void operate(Tag chunk, int state);
  85. }
  86. }

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. [置顶] spring集成mina 实现消息推送以及转发

    spring集成mina: 在学习mina这块时,在网上找了很多资料,只有一些demo,只能实现客户端向服务端发送消息.建立长连接之类.但是实际上在项目中,并不简单实现这些,还有业务逻辑之类的处理以及 ...

  2. Java解决Hanoi问题

    package fa.ct; import java.util.Scanner; public class Hanoi { public static void hanoi(int num,char ...

  3. css3的动画特效--动画序列(animation)

    首先复习一下animation动画添加各种参数 (1)infinite参数,表示动画将无限循环.在速度曲线和播放次数之间还可以插入一个时间参数,用以设置动画延迟的时间.如希望使图标在1秒钟后再开始旋转 ...

  4. TP3.2 图片上传及缩略图

    基于TP自带的上传文件的类, Think/Upload.class.php 设置表单的enctype属性 下面是上传的具体方法 /** * 图片上传处理 * @param [String] $path ...

  5. js二级事件模型的处理细节

    一.纠正网络上的一个误传--“IE不支持事件捕获” 可以在浏览器中运行上面demo,在各主流浏览器中,鼠标移上都可以分别触发捕获与冒泡事件的监听函数,所以IE也是支持事件捕获的,连IE6都支持,只是在 ...

  6. loadrunner录制脚本(一) ----录制脚本打不开浏览器

    loadrunner安装参考百度上的,或者有已经准备好的安装文档. 安装好了之后,用 HP Virtual Generator 录制脚本. 在上述操作中,需要选择火狐浏览器的exe文件驱动.也可以选择 ...

  7. Ajax 请求后打开新窗口被拦截的解决方案

    公司业务上有个场景,需请求后台获取支付链接地址,再打开地址引导用户购买.这样的场景在其他企业应该也很场景.但是遇到个很常见的问题,Ajax后直接用window.open(url),会被浏览器作为广告拦 ...

  8. 详解功能版本管理之使用eoLinker

    先看一个对话: "这里,你改一下,这里返回一个object." "好...好......" "还有这里,返回个String." ...... ...

  9. 17089 最大m子段和

    17089 最大m子段和 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC Description "最大m子段和 ...

  10. MySQL学习(二)复制

        复制解决的问题是保持多个服务器之间的数据的一致性,就如同通过复制保持两个文件的一致性一样,只不过MySQL的复制要相对要复杂一些,其基本过程如下:     1)在主库上将数据更改记录到二进制日 ...