086_文档资料管理系统
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
文档资料管理系统的设计
4.1系统需求分析及功能设计
随着信息时代的来临,电脑用户的资料日益增多,而这些资料可能有着不同的特点。比如,它可能是一本书,也可能是一张光碟,也可能是个电子文档。如果稍有疏忽,资料的存放位置失去了某些特征,例如,某些电子文档你可能放到了一个目录下,而另外一个文档你却放到了其它的目录下。当你需要的时候,将难于准确迅速的找到,更谈不上有效的查询和管理了。总之,资料属性的多元化和数量的增多给管理这些资料带来了很多不便。
文档资料管理系统的设计目标正是为了解决这些问题。它将满足用户对资源的管理:增加,删除,修改,搜索及查看资源。具体说来,该系统将具备下面的功能:
(1)增加资源——用户能够添加一个资源,该资源可以是电子资源(比如PC上某个目录下的一张图片)或者是非电子资源(例如书桌上的本书)。添加该资源后,用户将可以通过该系统直接管理和使用该资源。
(2)删除资源——用户能够将系统中的某个资源删除掉,从而放弃系统对该资源的管理。
(3)修改资源——当某个资源的属性发生变化的时候(例如存放位置发生变化),用户能够选中某个资源,对其属性进行修改,以反映这种变化。
(4)搜索资源——用户能够通过提供资源的某个特征属性进行查找,获得相关的资源。
(5)查看资源——如果所选择资源为电子文档,用户将能在系统中直接查看该资源。 本文来自think58 [资料来源:http://think58.com]
本文来自think58 [来源:http://think58.com]
内容来自think58
think58.com
[来源:http://www.think58.com]
think58好,好think58 [资料来源:http://THINK58.com]
[资料来源:http://THINK58.com]copyright think58 [来源:http://think58.com]
think58好,好think58 [资料来源:http://www.THINK58.com]
[资料来源:http://think58.com]
图1 整体框架设计图
资源应该具有以下属性:资源的作者,资源名称,资源的位置(若是电子资源,则是资源在电脑上的文件位置),资源添加日期,资源所属目录情况(一个资源可以属于多个目录),关键字(用于搜索), 资源的注释等。
下面就系统中对以上属性的定义:
struct RESITEM
{
int id; // 资源在文档中的唯一标志
string name; //资源名称
string author; //资源的作者
string path; //资源的位置(若是电子资源,则是资源在电脑上的文件位置)
bool bEbook;//是否是电子资源
string date; //资源添加日期
string keywords; //关键字,用于搜索
int catalogs; //资源所属目录情况(一个资源可以属于多个目录)
double bytes; //资源大小(只对电子资源有效)
string note; //资源的注释
};
4.2 XML存储结构的设计
本系统的用XML编写存储结构,参照一般的XML编写方法包含以下几个
类:XmlContainer(XmlTree),XmlFile,XmlLeaf,XmlNode,XmlParser。
表1 XmlFile设计表
类名:XmlFile
设计用途:用于将一个磁盘上的XML文档以字符串的方式读入到内存中,或者将以字符串方式存于内存中的XML文档输出到磁盘。 think58 [资料来源:http://THINK58.com]
方法/属性 作用
string _doc 保存XML字符串的内部成员变量。
bool load(const char* file) 将参数file指定的文件载入类的成员变量doc中。
bool save(const char* file) 将成员变量doc的值保存到file指定的文件中。
const string& getdoc() 返回doc的值。
bool setdoc(const string& _doc) 以_doc设置doc的值。
表2 Xmlparser设计表
类名:XmlParser
设计用途:用于实现XmlTree和字符串化的XML文档的相互转换。
方法/属性 作用
static XmlTree* doc2tree(const string& doc) 将doc转换成一个XmlTree。
static string tree2doc(XmlTree* pXmlTree) 将一个XmlTree转换为字符串。
static int gettoken(string strDoc, string& token) 从strDoc中获取第一个标记(或者值)
说明:正是通过这两个类的协作,实现了XML文档的读写和转换。例如:
XmlFile file;
if(!file.load("Settings\\items.xml"))
{
AfxMessageBox("打开数据文件items.xml失败");
return;
}
XmlTree* pTree = XmlParser::doc2tree(file.getdoc());
if(!pTree)
{ copyright think58 [资料来源:www.THINK58.com]
AfxMessageBox("转换数据文件items.xml失败");
return;
}
上面的代码段首先使用XmlFile的实例load了一个XML文档,然后使用XmlParser::doc2tree创建了一个XmlTree,从而为内存中使用XML提供了基础。
下面说明一下对XML的处理方案。使用树型结构表达XML文档,可以比较方便的进行相应的读写删改操作。因为XML本身就是一个数型的结构。例如:
<DATA>
<item>
<name>tttttt</name>
<catalogs>13</catalogs>
<path>d</path>
</item>
<item>
<name>xx</name>
<catalogs>7</catalogs>
<path>xx</path>
</item>
</DATA>
以上是一段程序中用到的XML文档结构。注意到整个文档以<DATA>开始,以</DATA>结尾,表示之间的都是存储的数据(实际上就是资源的属性数据)。中间共有两个item,而每个item又各有几个属性(如<name>,<catalogs>等)。所以可以用一颗树来表示:
图2 Xml树型结构图
注意到上面的树中有些节点只有Name没有Value,而有些却都有。虽然它们都是节点,但类型上还是有区别的。故,采用三个类表达这种信息:XmlNode,XmlLeaf,XmlContainer。
[资料来源:http://www.THINK58.com]
首先定义一个接口类XmlNode,该类表达抽象的XML节点。然后使用XmlLeaf类和XmlContainer类来实现XmlNode,XmlLeaf表示叶节点(有Name和Value双重属性的节点,但自己没有子节点),XmlContainer表示容器节点(只有Name属性的节点,而且自己可以有子节点)。下面是它们的定义:
class XmlNode
{
public:
XmlNode(){name = "node";parent = NULL;}
virtual ~XmlNode(){};
virtual bool isleaf()=0; //是否叶节点
virtual bool iscontainer()=0;//是否容器节点
virtual XmlNode* getparent(){return parent;}; //返回父节点
virtual bool setparent(XmlNode* _parent){ parent=_parent; return true;}; //设置父节点
virtual const string& getname(){return name;}; //返回节点名称
virtual bool setname(const string& _name){name=_name; return true;}; //设置节点名称
protected:
XmlNode* parent;
string name;
}; think58
[来源:http://www.think58.com]
class XmlContainer : public XmlNode
{
public:
XmlContainer(){pos = -1; name="container";};
XmlContainer(const string& _name){name=_name; pos = -1;};
~XmlContainer(){release();};
bool isleaf(){ return false;};
bool iscontainer(){return true;};
bool addchild(XmlNode* _node); //新增一个子节点
bool remove(XmlNode* pNode); //删除一个子节点
XmlNode* firstchild(); //返回第一个子节点
XmlNode* nextchild(); //返回下一个字节点
XmlNode* getchild(int nIndex); //返回第nIndex个子节点
XmlNode* search(const string& name); //找到第一个以name为名的子孙节点
XmlNode* search(const string& name, const string& value); //找到第一个以name为名,以value为值的叶节点
void trav(ostream& out); //遍历并输出到out中
void print(int lev);
protected:
void release();
int pos;
vector<XmlNode*> children;
};
typedef XmlContainer XmlTree; 内容来自think58 [来源:http://think58.com]
class XmlLeaf : public XmlNode
{public:
XmlLeaf(){name="leaf";};
XmlLeaf(const string& _name) {name=_name;};
XmlLeaf(const string& _name, const string& _value) {name=_name; value=_value;};
~XmlLeaf(){};
bool isleaf(){ return true;}; //是叶节点,返回true
bool iscontainer(){return false;}; //不是容器节点,返回false
const string& getvalue(){return value;}; //获取值
bool setvalue(const string& _value){value=_value; return true;};//设置值
protected:
string value;
};
think58.com [资料来源:http://www.THINK58.com]
上一篇:内存映射文件在进程中的应用与研究
下一篇:实验平台--实验平台