Board logo

标题: CMarkup定位解释---深入Markup分析器 [打印本页]

作者: look_w    时间: 2017-11-18 14:03     标题: CMarkup定位解释---深入Markup分析器

CMarkup定位解释


三年前,我写过一篇关于Cmarkup定位的解释,现在我用这篇文章代替那篇。

int nStart;

int nLength;

int nTagLengths;

int nFlags;

int iElemParent;

int iElemChild;

int iElemNext;

int iElemPrev;

前三个整数告诉我们了在文档中,元素的起始位置,它的长度以及开始和结束标签的长度,因为nStart是一个32bit的整数,所以文档
的最大尺寸可以有2G,并且同样,最大元素的长度是一样的。整数nTagLengths被分成两部分,22bit(4M)用于开始标签(开始标签可以包含属性),另外10bit1K)用于结束标签。在下列元素中,开始标签的长度是14,结束标签是8.,整个元素的长度是29

<topic id="5">triumph</topic>

整数nFlags的低16位实际存储的是元素的深度或层次,高16位是特殊标识。根元素是0层,根元素的孩子是1层等等
,特殊标识告诉我们元素是第一个兄弟或最后一个兄弟、或空元素、以及如果这个元素已经被删除了(这样的结构能够被恢复)

四个iElem整形变量链接到周围的相关元素,iElemParent指向父元素,iELemChild指向第一个子元素,iElemNext指向下一个元素,当这个元素是最后一个兄弟时,iElemNext0,当元素不是第一个兄弟元素时,iElemPrev指向其前一个兄弟元素,如果元素是第一个兄弟元素,iElemPrev指向最后一个兄弟元素。因此,顺着iElemChild的链接以及从那里沿着iElemPrev的链接,可以得到父元素的最后一个子元素。


如果你熟悉像这样用树结点链接在一起的工作方式,你将明白这个地图的效果。这个设计对于树层次的回来操作是有效的,再通过兄弟元素形成一个环,但是,对于随机访问第n个子元素将需要先循环这个元素之前的所有兄弟元素。一旦被建立起来,在文档中随意的导航将不再需要费时的分析。


当一个文档被分析时,就产生了这些信息,因此当文档被修改时,这些信息也修改。例如,增加一个属性,开始标签的长度改变了,元素的长度改变了,以及所有后面的和包含的元素都要被调整。如果删除一个元素,领衔值改变了,还有其前一个元素的iElemNext也被修改以绕过删除的元素等等。





深入Markup分析器



虽然Markup经常被叫做是“分析器”,但是分析保是Cmarkup功能中的一部分,另外Cmarkup还支持文档的导航、创建和修改,还有其它如文件I/O、字符集及64位编码转换等功能。然而分析器是Cmarkup一个最重要的功能,因为这样可以导入和访问现有XML文件。


分析器在SetDocLoad方法中分析文档,并建立定位数组,这是一个非验证的分析器,这表明它不会依照着DTDSchema来检查文档的正确性。它只会检查格式的好坏,如果结束标签不匹配开始标签它会产生一个错误,如果没有根元素存在会产生一个错误,或者其它一些不正确的结点样式它也会产生一个错误。








欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0