BooguNote文件格式解析
本文版权归属[Geek4.us]
写在开头的话:
这是我写完BooguNote全解之后不久就定下的一篇文章,结果变成了一个坑,直到现在。
这是一篇比较硬的文章,因为涉及到与编程语言有关的话题。在本文中,我将根据BooguNote作者公布的Boo文件格式,结合著名XML开发工具Altova XMLSpy的Schema生成功能,对其进行简单的说明,并且简单地演示如何使用这种格式。
我的编程水平比较低,给的例子非常简单,请各位多担待。
1、Boo其实是……
BooguNote建立的文件后缀名是.boo,但它实际上是非常标准的XML文件。实际上,我们可以直接用文本编辑器来开启.boo文件,这样就会看到XML的代码。例如,官方提供的下载压缩包里自带的“教程.boo”:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <root version="5"> <item content="预备知识" icon="star" branch="open" block="narrow" level="0" IsShown="true" IsBold="true" ShowBranch="false"> <item content="1.这个教程与BooguNote.exe在同一个目录下。" icon="none" branch="none" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="false"/> <item content="2. 文字块有三种选择状态:焦点,被选择,未选择。焦点态时文字块周围有框。被选择时文字块有虚线边框有背景色。未选择时文字块无框无背景色。" icon="none" branch="none" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="false"/> <item content="3.文字框有三种宽度:窄,宽,收缩。收缩的意思就是收缩成只有一行。这三种状态的宽度可以在“设置”->“文字块”页面上进行设置" icon="none" branch="none" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="false"/> <item content="4. BooguNote 可以保存文件快捷方式。如果文件快捷方式是指向一个图像文件的。BooguNote还可以显示这个图像文件的缩略图。" icon="none" branch="none" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="false"/> <item content="5.BooguNoteu可以选择性的现实父节点到子节点的连线。我叫他“树枝线”" icon="none" branch="none" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="false"/> <item content="6.BooguNote有两个菜单:主菜单和上下文菜单" icon="none" branch="open" block="narrow" level="1" IsShown="true" IsBold="false" ShowBranch="true"> <item content="打开主菜单,点击标题栏上的倒三角打开主窗口,在任务栏图标上右键单击" icon="none" branch="none" block="narrow" level="2" IsShown="true" IsBold="false" ShowBranch="false"/> <item content="打开上下文菜单,在boo文档视图上单击右键" icon="none" branch="none" block="narrow" level="2" IsShown="true" IsBold="false" ShowBranch="false"/> </item> </item> …… </root>
有点儿乱吧?没关系,下面就祭出Altova XMLSpy这一神器,为“教程.boo”生成Schema,然后查看其Schema视图:

这样子就一目了然了。整个boo文件的根节点是root,root有一个属性是version;root下面会包含若干item节点,而每个item节点都有若干个属性;同时,item节点是可以嵌套的。你在BooguNote界面里看到的每个文字块,都对应boo xml中的一个item节点。
root-version:文件结构的版本,目前是5;
item-level:任何>=0的整数,表示文字块的右移缩进层级;
item-icon:文字块前的图标;可用的值如下:
none:没有图标;
flag:红旗图标;
tick:绿勾图标;
cross:黑叉图标;
star:黄色星星图标;
question:蓝色问号图标;
warning:三角形警告图标;
idea:黄色灯泡图标;
item-content:文字块内容;必备;
item-branch:描述子节点(子文字块)的信息;可用的值如下:
none:无子节点,句前块为空心矩形块;
open:有子节点并且显示子节点,句前块为减号+矩形块;
close:有子节点但不显示子节点,句前块表示为加号+矩形块;
item-block:文字块状态;可用的值如下:
- narrow:窄;
- wide:宽;
- shrink:收起;
item-ShowBranch:是否显示从该节点到子节点的连线(true/false);
item-IsShown:表示是否显示这个文字块,这个属性是作者内部使用的(true/false);
item-IsBold:是否要加粗文字块的字体(true/false)。
由上可见,BooguNote的文件结构相当不复杂,但BooguNote又是如此的好用,不禁要赞一下作者大人——这样的XML我也能设计出来,但这样的软件我就做不出来了。
2、自己使用boo文件
好了,知道了boo文件的结构,现在咱们就可以自己写代码去使用boo文件了。BooguNote作者最近还在Group上贴出了C++读写Boo文件的两个函数,不过对我来说,C++实在是太难了。所以下面我要介绍两种内置了XML解析的语言。
2.1、ActionScript 3
首先是我心目中解析XML最爽的语言——ActionScript 3。AS3是Flash使用的编程语言,基于ECMAScript标准,并实现了ECMAScript for XML(E4X)这一标准。这使得用AS3编写使用XML的程序变得非常简单。咱们就来看看下面的例子:
假设boo是一个AS3的XML(不用import就可以直接用,可见在AS3里的重要性)对象,并且已经读取了上面的“教程.boo”;那么:
trace(boo.item[0].@content);
就可以在console里输出“预备知识”。
再来看看查找:
trace(boo.item.(@content == “预备知识”).toXmlString());
就会在console里输出content为“预备知识”的这个节点内嵌的所有内容。
很简单吧?更多AS3读取XML的内容,可以到Adobe的官方网站去查看:
www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/XML.html
2.2、C#
C#采用一种名为LinQ for XML的方法来解析XML,这种方法看上去非常像SQL。仍然假设已经有一个叫boo的XElement(System.Xml.Linq.XElement)对象并已经载入了“教程.boo”;
那么:
var search = from c in (from d in boo.Elements("item") where (string)d.Attribute("content") == “预备知识” select d ).Elements("item") select c;
这一句,跟上面的“boo.item.(@content == “预备知识”)”是等价的。看来,C#的方法还是要麻烦了不少啊。
好了,这篇文章就到这里吧,希望以后能看到在线版的BooguNote~
[...] 全文请到geek4.us/boogunote-file-format/阅读。 [...]
[...] This post was mentioned on Twitter by 倒霉熊 and yibie, coolcfan. coolcfan said: Geek4Us更新:BooguNote文件格式解析 http://geek4.us/boogunote-file-format/ [...]
呵呵,非常感谢。看来我的boogu.me主页上要专门为你这样的热心用户做一个页面加入你们的文章链接了。
不用不用,赶紧开个论坛吧……Google Groups被墙奸得我一点儿脾气都没了……
P.S. 下次回复的时候把主页填上……这主题之前有个Bug……修正了之后,留过言的仍然没变。
收到
我在godaddy上面架的站。不太清楚应该架什么论坛。有啥推荐没?以前知道有个Discuz不错。
呃,Discuz国人用的特别多,phpWind、phpBB之类的老外用得比较多……
收到。最近要办的事情有点多。搞完了就架个站
顶一下,然后再看。