没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
CMarkUp 使用简介
最近正在研究 C++下的 XML 分析工具 CMarkup。初次和 XML 相遇是基于 C#对 XML 的操
作。C#的 XmlDocument 和 XmlNode 给我印象之深,让我至今都无法忘怀。现在想在 C++
下发掘 XML 的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工
具。不像 C#那样,已经打成包供你直接使用了。好在有知道 CMarkup 这个小型 XML 的分
析器,可以为我所用。俗话说:磨刀不误砍柴工。我现在就来磨下刀。
1、初始化
Load 导入一个 XML 文件到 CMarkup 的对象中,并对它进行解析。类似 C#的 Load。
SetDoc 从字符串中导入 XML 数据,并对它解析。类似 C#的 LoadXml。
2、输出
Save 将 XML 数据写入文件中。类似 C#的 Save。
GetDoc 将整个 XML 数据文档作为字符串返回。
3、改变当前位置
FindElem 定位到下一个元素,可能和一个标签名或路径匹配。
FindChildElem 定位到下一个子元素,匹配元素名或路径。
FindPrevElem 定位前一个元素,可能和一个标签名或路径匹配。
FindPrevChildElem 定位前一个子元素,可能匹配标签名。
FindNode 定位下一个节点,可能和节点类型匹配。
IntoElem 进入当前主位置的下一级,当前的位置变为父位置。
OutOfElem 使当前父位置变成当前位置。
ResetPos 复位当前位置为文档起始位置。
ResetMainPos
将当前主位置复位为第一个兄弟位置之前。
ResetChildPos 复位当前子位置到第一个子位置之前。
4、文档新增
AddElem 在当前主位置元素或最后兄弟位置之后增加一个元素。
InsertElem 在当前主位置元素或第一个兄弟位置之前插入一个元素。
AddChildElem 在当前子位置元素或最后一个子位置之后增加一个元素。
InsertChileElem 在当前子位置元素或低一个子位置之前插入一个元素。
AddSubDoc 在当前主位置元素或最后一个兄弟位置之后增加一个子文档。
InsertSubDoc 在当前主位置元素或第一个兄弟位置之前插入一个子文档。
AddChildSubDoc 在当前子位置元素或最后一个子位置之后增加子文档。
InsertChildSubDoc 在当前子位置元素或第一个子位置之前插入一个子文档。
AddNode 在当前节点之后或父元素内容末尾增加一个节点。
InsertNode 在当前节点之前或父元素内容开头插入一个节点。
5、文档中删除
RemoveElem 删除当前包括子元素的主位置元素
RemoveChildElem 删除包括当前子元素及其子元素
RemoveNode 删除当前节点
RemoveAttrib 删除当前位置元素具体的属性
RemoveChildAttrib 删除当前子位置元素的某个具体属性
6、得到值
GetData 得到当前主位置元素或节点的字符串值
GetChildData 得到当前子位置元素的字符串值
GetElemContent 得到当前主位置元素包括其子元素的标记内容字符串值
GetSubDoc 得到当前主位置元素包括其子元素的文档片断标记字符串值
GetChildSubDoc 得到当前子位置元素包括其子元素的文档片断标记字符串值
GetAttrib 得到主位置元素(或正在进行的指令的)某一具体属性字符串值
GetChildAttrib 得到子位置某一特定属性的字符串值
GetTagName 得到主位置元素(或正在进行的指令的)标签名称
GetChildTagName 得到子位置元素的标签名称
FindGetData 定位到匹配某一具体路径的下一个元素并返回字符串值
7、设置值
SetData 设置当前主位置元素或节点的值
SetChildData 设置当前子位置元素的值
SetElemContent 设置当前主位置元素的标记内容
SetAttrib 设置当前主位置元素(或正在进行的指令的)某一具体属性的值
SetChildAttrib 设置当前子位置元素某一具体属性的值
FindSetData 定位匹配某一具体路径的下一个元素并设置其值
8、获取其他信息
GetAttribName 当过当前位置元素属性的具体索引得到属性名称
GetNodeType 得到当前节点的节点类型
GetElemLevel 得到当前主位置的级数
GetElemFlags 得到当前主位置元素的标志
SetElemFlags 设置当前主位置元素的标志
GetOffsets 获得在当前主位置偏移的文档文本
GetAttribOffsets 获得在当前主位置特定属性便宜的文档文本
9、保存位置信息
SavePos 在 hash map 中使用可选字符串名称保存当前位置
RestorePos 定位到通过 SavePos 保存的位置
SetMapSize 设置 SavePos 和 RestorePos 使用的 hash map
大小
GetElemIndex 得到当前主位置元素整形索引值
GotoElemIndex 设置当前主位置元素为给定的整形索引值
GetChildElemIndex 得到当前子位置元素的整形索引值
GotoChildElemIndex 设置当前子位置元素为给定的整形索引值
GetParentElemIndex 获得当前父位置元素的整形索引值
GotoParentElemIndex 设置当前父位置元素为给定的整形索引值
GetElemPath 获得表示主位置元素绝对路径的字符串
GetChildElemPath 获得表示子位置元素的绝对路径的字符串
GetParentElemPath 获得表示父位置元素的绝对路径的字符串
10、文档状态
IsWellFormed 判定文档是否有单一根元素和恰当地包含元素
GetError 从最后的解析中返回错误(信息)字符串
GetDocFlags 返回文档标志
SetDocFlags 设置文档标志
GetDocElemCount 返回文档中元素的个数
11、静态的实用函数
ReadTextFile 读一个文本文件转成字符串
WirteTextFile 写字符串到文本文件中
GetDeclareEncoding 从 XML 声明中得到编码的名字
EscapeText 返回标记中某一字符的编码
UnescapeText 返回字符串值得某一特定字符解码
UTF8ToA 将 UTF-8 字符转成非 Unicode(如 ANSI)字符
AToUTF8 将非 Unicode(如 ANSI)字符转成 UTF-8 字符
UTF16T08 将 UTF-16 字符转成 UTF-8
UTF8To16 将 UTF-8 字符转成 UTF-16
EncodeBase64 将二进制数据译成 Base64 字符串
DecodeBase64 将 Base64 字符译成二进制数据
自此,CMarkup 的方法说明我已经翻译完成。有很多都是按照自己的理解或纯按字面
意思翻译的。肯定还是理解不够准确地。后面的文章中,我会对每一个方法的代码进行一些
简单分析,主要是给自己做技术积累用。欢迎大家指导!
CMarkup 使用概述(1)
CMarkup概述
创建一个新的 XML文档,分析修改现存的 XML 文档,所有的这些都中可以从一个利用 MFC
或 STL 字符串所实现的一个简单类的方法中得到。关于 CMarkup,你可以运行 Zip 文件右边
的例子,如果你愿意,你可以通过看源码,几分钟把它加入到你自己的应用中。
特征
Cmarkup 是依据 EDOM 的,这是这个简单 XML 分析的关键。EDOM 是操作 XML 元素、
属性和数据的简明方法集。当你不需要复杂的 XML 特性时,它避免你读大量的 DOM 和 SAX
文档。
如果你希望使用微软的 MSXML,CMarkup 工程中 CmarkupMSXML 类全面的演示了通过
EDOM 来使用 MSXML,并且它是以 C++ COM 语法开始。
下载包(看上面 zip 文件的链接)中包含了测试对话框工程的源码、Cmarkup 类的所有测试和
示例、以及编译选项。关于用在商业用途中的详细说明请看文章底部的在 Licensing 中的注意
事项。
下面列出了 CMarkup 的特征:
独立:不需要任何外部的 XML 组件。
小:编译到你的工程只是很小的一个类,并且对于文档只维持了一个字符串,以及一个总计小于
字符串内存大小的索引数组。
快:分析器在相当快的建立索引数组。
简单:EDOM 方法使创建、导航和修改XML无比的简单。
MSXML:CMarkupMSXML 类用 EDOM 方法包装了微软的 XML 服务。MSXML 编译选项用来
演示这个类。
UNICODE(统一字符编码标准):对于 WindowsNT 和 WindowsCE 平台能够被编译成
UNICODE,在 WindowsNT UNICODE 下,XML 文档是流到 UTF-8 文件中,但是内部用宽
字符。
UTF-8:对于 UTF-8 文件,这接受和返回 UTF-8 字符串(确保_MBCS 没有被定义)
MBCS:对于双字节数据(定义_MBCS),它不与 UTF-8 兼容.
STL:CMarkupSTL 类完全没有使用 MFC,它的演示要使用 STL 编译选项。
每天数据的 XML
我们经常在一个文件里需要保存或传递信息,或从计算机A 发送一个信息块到计算机B。
总是有这样一个问题出现:
我要怎样安排这些数据的格式?
出现XML之前,你可能要考虑“env”
类型,例如PATH=C:\WIN95; “ini”类型(一些部分的组合),逗号限制或其它一些限制、
或者是固定了字符串的长度。现在XML就是被确定的这些问题的答案,但是某些时候,程序员
很气馁,他们需要一些便于帮助分析和格式尖括号所有这些的解决XML的复杂性。对于最低限
度读XML标签匹配规则,我建议阅读在CcodeProject站点的“Beginning XML - Chapter 2:
Well-Formed XML”
XML 更好是因为它的灵活和自然的等级,加上它广泛的应用。虽然 XML 比限定格式用了更
多的字符,如果需要的话它可以良好的向下压缩。当你需要扩展你文档信息类型时,XML 的灵
活性得到了体现,不需要要求信息的每个消费者重写逻辑过程。你能够保持旧的信息标识,并且
制定用相同的方式增加新属性和元素。
使用 CMarkup
Cmarkup是基于“压缩”文档对象模型(EDOM : "Encapsulated" Document Object
Model,),这是这个简单XML处理器的关键。它的一套XML处理方法和产生的效果与
DOM(Document Object Model)是一样的。但是整个DOM有无数的对象类型,而EDOM只定
义了一个对象:XML文档,EDOM回到了XML原始的吸引力—简单。关于方法的完整文档,请
看 EDOM Specification.
CmarkUp 封装了 XML 文档文本、结构和当前位置。它提供了增加元素、导航和得到元素
属性和数据的所有方法以。在文档中操作被执行的地方取决于当前位置和当前孩子位置。当前位
置允许你增加一个元素到文档中的这个位置,而不需要明确指出增加对象到文档的这点上,在
CMarkup 的有效生命周期里,对象一直保持着一个用来描述文档的字符串,当你调用 GetDoc.
可以得到它。
查看 free firstobject XML editor的源码,这是用CMarkup创建、导航你自己的XML文档。
创建一个 XML 文档
对于创建一个 XML 文档,需要实例化一个 CMarkup 对象,并调用 AddElem 创建根元素。.
在这个位置,如果你调用 AddElem("ORDER") ,你的文档会简单的装一个空 ORDER 元素
<ORDER/>. 然后调用 AddChildElem 在根元素的下面创建元素 (例如:“进入”根元素内部,
层次表示).下面的示例代码创建一个 XML 文档并返回它(的内容)到一个字符串中。
CMarkup xml;
xml.AddElem( "ORDER" );
xml.AddChildElem( "ITEM" );
xml.IntoElem();
xml.AddChildElem( "SN", "132487A-J" );
xml.AddChildElem( "NAME", "crank casing" );
xml.AddChildElem( "QTY", "1" );
CString csXML = xml.GetDoc();
这些代码产生了下面的 XML,这个根结点是 ORDER 元素;注意它的开始标签<ORDER> 在
开头,结束标签</ORDER>在结尾。当一个元素是在一个父下面(深入或被包含),这个父元素
的开始标签要在它之前,结束标签要在它之后。ORDER 元素包含一个 ITEM 元素,而 ITEM 元
素包含了三个字子元素:SN、NAME 和 QTY;
<ORDER>
<ITEM>
<SN>132487A-J</SN>
<NAME>crank casing</NAME>
<QTY>1</QTY>
</ITEM>
</ORDER>
如例子中所显示的,你也能够在一个子元素下创建新元素,这需要调用 IntoElem 移动你
的当前主位置到当前子元素位置,然后你就可以在这下面增加一个子元素了。CMarkup 在索引
中保持了一个当前位置指针,以保证你的源码更加短和更简单,当导航文件时,相同的逻辑位置
也会被使用。
导航 XML 文档
上面的例子所创建的 XML 字符串,用 SetDoc 方法加入到 CMarkup 对象中能够被解析,
你也可以引导它正确的进入被创建的同一个 CMarkup 对象中,如果你要设置当前位置到文档的
开始时,需要调用 ResetPos.
在下面的例子中,从 csXML字符串生成CMarkup对象后,我们循环 ORDER元素下的所有 ITEM
元素,并得到每个项目的序号和数量。
CMarkup xml;
xml.SetDoc( csXML );
while ( xml.FindChildElem("ITEM") )
{
xml.IntoElem();
xml.FindChildElem( "SN" );
CString csSN = xml.GetChildData();
xml.FindChildElem( "QTY" );
int nQty = atoi( xml.GetChildData() );
xml.OutOfElem();
}
对于我们发现的每个元素,在查询它了子元素之前要调用 IntoElem,查询完之后再调用
OutOfElem ,当你习惯于这种导航类型时,你将知道,检查你的循环时,要确定每个 IntoElem
调用都有一个与之对应的 OutOfElem 调用 。
增加元素和属性
上面创建文档的例子中仅创建了一个 ITEM 元素,现在这个例子是创建多个项目,从前一个内容
加裁后,再增加数据源,加上 SHIPMENT 信息元素中有一个属性,这段代码也演示了你能调用
剩余28页未读,继续阅读
资源评论
硅步万里
- 粉丝: 36
- 资源: 49
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功