现在的位置: 首页 > 综合 > 正文

CMarkup 使用概述

2013年10月04日 ⁄ 综合 ⁄ 共 2871字 ⁄ 字号 评论关闭

   CMarkup概述

 

 

创建一个新的XML文档,分析修改现存的XML文档,所有的这些都中可以从一个利用MFCSTL字符串所实现的一个简单类的方法中得到。关于CMarkup,你可以运行Zip文件右边的例子,如果你愿意,你可以通过看源码,几分钟把它加入到你自己的应用中。

 

特征

Cmarkup是依据EDOM的,这是这个简单XML分析的关键。EDOM是操作XML元素、属性和数据的简明方法集。当你不需要复杂的XML特性时,它避免你读大量的DOMSAX文档。

如果你希望使用微软的MSXMLCMarkup工程中CmarkupMSXML类全面的演示了通过EDOM来使用MSXML,并且它是以C++ COM语法开始。

下载包(看上面zip文件的链接)中包含了测试对话框工程的源码、Cmarkup类的所有测试和示例、以及编译选项。关于用在商业用途中的详细说明请看文章底部的在Licensing中的注意事项。       

 

下面列出了CMarkup的特征:

独立:不需要任何外部的XML组件。

小:编译到你的工程只是很小的一个类,并且对于文档只维持了一个字符串,以及一个总计小于字符串内存大小的索引数组。

快:分析器在相当快的建立索引数组。

简单:EDOM方法使创建、导航和修改XML无比的简单。

MSXMLCMarkupMSXML类用EDOM方法包装了微软的XML服务。MSXML编译选项用来演示这个类。

UNICODE(统一字符编码标准):对于WindowsNTWindowsCE平台能够被编译成UNICODE,在WindowsNT UNICODE下,XML文档是流到UTF-8文件中,但是内部用宽字符。

UTF-8:对于UTF-8文件,这接受和返回UTF-8字符串(确保_MBCS没有被定义)

MBCS:对于双字节数据(定义_MBCS),它不与UTF-8兼容.

STLCMarkupSTL类完全没有使用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元素包含了三个字子元素:SNNAMEQTY

<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();

}

抱歉!评论已关闭.