`
chiron.k
  • 浏览: 4859 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

用连连看的方法比较XML文档

阅读更多
比较两个XML文档在语义上相等,比想的要难一点。例如,下面的两个XML文档
1.xml
<xml/><a><b>bb</b><c k='11'></c></a>
2.xml
<xml/><a><c k='11'></c><b>bb</b></a>
排列有些不同,但内容还是一样的.
如果用DOM比较的话,算法基本上就是,
1 解析第一个文档,构成一个结点树
2 遍历第二个文档结点,搜索第一个文档树,找到对应的结点,比较。
但问题是怎么找到对应的结点,首先是结点位置的层次问题,其次怎么确定对应关系。
对于层次问题,我们可以标记,在同一级的兄弟结点上比较。
但就算我们缩小了范围,对于没有特殊标记的结点,比如<li>这样的标签,还是很难确定对应关系,就算是想排序都没有关键字。
虽然我也知道,基于树都可以做递归,去简化设计,但真没想出来:<

最后还是连连看的灵感。打碎再比较.
基本的思路,
把结点分成两类,有BODY的和没有BODY的.
比如上面的XML文件,
就可以分成有BODY的<b>bb</b>;没有BODY的<xml/>, <a></a>, <c k='11'></c>,这几个结点.最终的目标就是比较这些打碎的TAG.
同时流式解析两个XML文件,,并为每一个文件生成相应的一个TAG栈.
把一个TAG压进栈,要分两次进行,第一次,压进<xx>,如果有BODY的话,把BODY也压进去.第二次,压入</xx>.
这样我们还需要一个指针栈,标记未完全压入栈的TAG.
同时把完全压入栈的元素,放到一个比较队列里.,每完全压入一个元素,就比较两个栈的比较队列.如果相同,就删除这个TAG.如果两个XML文件,基本相似的话,比较队列的SIZE都会保持比较小的值.节省很多的遍历开支.

完成XML的解析后,只要比较两个栈中比较队列的大小,如果都为空,那么这两个XML就是内容相等的.

但这个的算法,忽略了结点的位置信息.
比如,<a></a><a></a>和<a><a></a></a>也会被等同.
这里做了一个简单的扩展.为每一个TAG加一个ID属性,
第一个压入未完全压入栈的TAG的ID值为该TAG的<xx>和BODY字符串的hashCode值.
以后入栈的TAG的ID值是未完全压入栈栈顶元素ID值+该TAG的<xx>和BODY的hashCode值.比较时,先比较一个ID然后再比较内容.

目前只完成了一个很简单的实现.还不能比较不同排列的属性,但对于我的需求来说,已经足够了.
分享到:
评论

相关推荐

    c#winform开发的连连看

    在本文中,我们将深入探讨如何使用C# WinForm开发一款连连看游戏,并通过XML文件来存储和读取游戏地图。连连看是一款广受欢迎的休闲益智游戏,玩家需要找到并消除一对相同的图案,直到所有匹配的图案都被消除。在C# ...

    极品连连看(C#)VS2005+XML

    《极品连连看(C#)VS2005+XML》是一款基于C#语言开发的连连看游戏,利用Visual Studio 2005作为集成开发环境。这款游戏不仅具有趣味性,而且是初学者学习游戏编程的理想资源,因为它展示了基础的游戏逻辑和交互设计。...

    完整连连看消除项目

    6. **其他辅助文件**:如README文档,解释项目如何运行和编译,或者LICENSE文件,规定了项目的使用许可条件。 开发这样一个连连看消除项目,你需要掌握以下知识点: 1. **Android开发基础**:理解Android应用程序...

    android连连看源码实例

    在`res/layout`目录下,通常会有XML布局文件,用于定义连连看游戏的用户界面。这些文件描述了游戏板、按钮、图像视图等UI元素的位置和属性。例如,连连看游戏的棋盘可能会由一个自定义的`GridView`实现,允许用户...

    一款完美运行的Android连连看(源代码)

    2. **Activity与布局**:连连看的主界面通常由一个Activity负责,这个Activity会加载一个XML布局文件,其中包含了游戏的各种元素,如棋盘、计时器、分数显示等。在`res/layout`目录下,我们可以找到这个布局文件,...

    Android 连连看源码

    【Android 连连看源码】是一款基于安卓平台开发的经典消除类游戏——连连看的源代码,主题为海贼王系列,允许用户更换游戏素材,同时具备倒计时功能,为开发者提供了深入学习和定制游戏体验的机会。在这个项目中,...

    andorid 连连看小游戏

    我们可以使用Android的布局管理器(如LinearLayout、RelativeLayout或ConstraintLayout)来组织这些元素,并通过XML文件定义。自定义View类可以实现游戏面板的特殊效果,例如点击动画、选中状态等。 接着,游戏逻辑...

    安卓连连看程序源码

    2. **布局文件**:如`activity_main.xml`,定义了游戏界面的布局,包括连连看的棋盘、计分板、时间显示和操作按钮等元素。XML布局文件用于描述UI组件和它们的相互关系。 3. **Java或Kotlin代码**:游戏的核心逻辑...

    WPF开发的一个小型连连看游戏

    在连连看游戏中,每个动画作为一个独立的方法,这表明游戏设计者充分利用了WPF的时间线和关键帧动画机制,如棋子的出现、消失、匹配效果等,这些都可以通过定义动画来实现。 3. **烟花特效**:标签中提到的“烟花...

    安卓连连看

    通过学习和实践安卓连连看的源码,可以深入理解Activity的生命周期管理、Intent的使用来跳转界面、以及如何在XML中布局UI元素。同时,对于资源的管理和优化,如图片、音频等资源的加载和释放,也是Android开发中不可...

    android游戏-连连看

    使用XML文件来定义界面元素,如ImageView用于显示游戏图标,LinearLayout或GridLayout来组织图标的位置。你还需要添加触摸事件监听器,以便用户可以通过点击屏幕上的图标来进行操作。 动画效果能够提升游戏体验。...

    安卓游戏连连看源码

    此外,考虑到源码的可运行性,项目可能还包括了AndroidManifest.xml文件,它是每个Android应用的核心配置文件,用于声明应用所需的权限、启动Activity以及服务等信息。同时,资源文件夹(res)中可能包含了游戏的...

    精致的水果连连看源码

    1. 游戏布局:连连看游戏的界面通常由一系列可点击的图片(代表不同的水果)组成,这些图片通常通过XML布局文件定义。源码中会有一个或多个XML文件,如“game_layout.xml”,用于描述游戏界面的元素和布局。 2. ...

    android连连看游戏源码

    通过XML布局文件定义这些组件的位置和样式,然后在Java代码中实例化并添加到Activity中。使用Canvas和Paint类,开发者可以自由绘制各种游戏元素,如棋盘、棋子、连线动画等,实现视觉效果。 事件处理是实现游戏交互...

    android连连看毕业设计

    1. **UI设计**:在Android中,UI设计主要依赖于XML布局文件。连连看游戏界面需要包括游戏面板、计分区域、功能按钮(如难度选择、提示、重列等)。开发者可能使用了LinearLayout、RelativeLayout或ConstraintLayout...

    android 连连看

    至于"连连看"的游戏文件,其名称为"连连看",很可能包含了游戏的资源文件(如图片、音频)、程序代码(可能为.java或.kt文件)、配置文件(如XML)以及其他支持文件。开发者可能使用Android Studio这样的集成开发...

    android .net交互连连看。内含毕业设计论文与PPT

    虽然非标准,但在某些小型项目中,为了简化开发,可能会选择将数据直接写入文本或文档文件。通常,更常见的方式是使用关系型数据库,如MySQL、SQL Server或SQLite,对于Android应用,SQLite是一个常用的选择,因为它...

    android下简易连连看源代码

    首先,Android Game Project是项目的核心部分,这通常包含了Android Studio工程的所有文件,如XML布局文件、Java源代码、资源文件(如图片、音频等)以及AndroidManifest.xml配置文件。开发者使用Java或Kotlin作为...

    Android连连看游戏源码

    在Android环境下,游戏的界面通常是通过XML布局文件定义的,源码中的Chessboard文件可能就是游戏棋盘的布局文件。它包含了游戏棋盘的结构,包括每个单元格的位置、大小以及背景图片等。开发者可以通过修改这个文件来...

    Android 连连看 游戏项目实例源码

    - 使用XML布局文件在`res/layout`目录下定义游戏界面,可能包括游戏面板、计时器、得分显示等组件。 - 自定义View:游戏面板可能需要自定义`View`类来绘制游戏棋盘,处理触摸事件,实现动画效果。 4. **图片资源*...

Global site tag (gtag.js) - Google Analytics