CMarkup定位解释——深入Markup分析器

CMarkUp使用实例 最近正在研究C++下的XML分析工具CMarkup。想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经打成包供你直接使用了。好在有知道CMarkup这个小型XML的分析器,可以为我所用。俗话说:磨刀不误砍柴工。我现在就来磨下刀。 立即下载
CMarkup定位解释
 
三年前,我写过一篇关于Cmarkup定位的解释,现在我用这篇文章代替那篇。
int nStart;
int nLength;
int nTagLengths;
int nFlags;
int iElemParent;
int iElemChild;
int iElemNext;
int iElemPrev;
前三个整数告诉我们了在文档中,元素的起始位置,它的长度以及开始和结束标签的长度,因为nStart是一个32bit的整数,所以文档 的最大尺寸可以有2G,并且同样,最大元素的长度是一样的。整数nTagLengths被分成两部分,22bit(4M)用于开始标签(开始标签可以包含属性),另外10bit(1K)用于结束标签。在下列元素中,开始标签的长度是14,结束标签是8.,整个元素的长度是29.
<topic id="5">triumph</topic>
整数nFlags的低16位实际存储的是元素的深度或层次,高16位是特殊标识。根元素是0层,根元素的孩子是1层等等 ,特殊标识告诉我们元素是第一个兄弟或最后一个兄弟、或空元素、以及如果这个元素已经被删除了(这样的结构能够被恢复)
四个iElem整形变量链接到周围的相关元素,iElemParent指向父元素,iELemChild指向第一个子元素,iElemNext指向下一个元素,当这个元素是最后一个兄弟时,iElemNext是0,当元素不是第一个兄弟元素时,iElemPrev指向其前一个兄弟元素,如果元素是第一个兄弟元素,iElemPrev指向最后一个兄弟元素。因此,顺着iElemChild的链接以及从那里沿着iElemPrev的链接,可以得到父元素的最后一个子元素。
    如果你熟悉像这样用树结点链接在一起的工作方式,你将明白这个地图的效果。这个设计对于树层次的回来操作是有效的,再通过兄弟元素形成一个环,但是,对于随机访问第n个子元素将需要先循环这个元素之前的所有兄弟元素。一旦被建立起来,在文档中随意的导航将不再需要费时的分析。
    当一个文档被分析时,就产生了这些信息,因此当文档被修改时,这些信息也修改。例如,增加一个属性,开始标签的长度改变了,元素的长度改变了,以及所有后面的和包含的元素都要被调整。如果删除一个元素,领衔值改变了,还有其前一个元素的iElemNext也被修改以绕过删除的元素等等。
 
深入Markup分析器
 
    虽然Markup经常被叫做是“分析器”,但是分析保是Cmarkup功能中的一部分,另外Cmarkup还支持文档的导航、创建和修改,还有其它如文件I/O、字符集及64位编码转换等功能。然而分析器是Cmarkup一个最重要的功能,因为这样可以导入和访问现有XML文件。
    分析器在SetDoc和Load方法中分析文档,并建立定位数组,这是一个非验证的分析器,这表明它不会依照着DTD和Schema来检查文档的正确性。它只会检查格式的好坏,如果结束标签不匹配开始标签它会产生一个错误,如果没有根元素存在会产生一个错误,或者其它一些不正确的结点样式它也会产生一个错误。
    在7.0版 本中,分析器使用了新的分析方法,不再使用递归实现。在以前的版本中,使用递归方法实现时,每次在另一个元素中发现一个元素就调用自己,当它到达父结点的 结束标签时返回。因为每次嵌套调用都要增加局部变量和参数到堆栈中,但是在堆栈的尺寸是有限的任何平台上,例如掌上操作系统,这时,递归就成为一个问题 了。虽然大多数的文件不会大于10个元素的深度(嵌套),也许在栈中只需要500bytes,然而,这仍是一个潜在的危险。新的分析器使用了一个叫NodeStack的小数组,它就像一个栈,但是它在堆里的。
它保持着一直到当前深度的所有被嵌套的元素的标签名。
    分析函数x_ParseElem实际上相当简单,它通过调用x_ParseNode查找和检查下一个结点来循环所有的结点,直到文档的结束。关于结点类型的讨论可以看在Nodes的文章。元素的结束标签被表示成0的结点类型,因为它是元素结点的结束。
    NodeStack 用来记录被嵌套的元素,当一个起始标签被遇到时,它将呆在NodeStack中,直到相对应的结束标签被发现。如果一个元素A包含其它一些元素,那么这些 元素将会放到NodeStack中,并且置于元素A的上面,在恢复父元素(元素A)之前,需要匹配它们的结束标签然后从NodeStack中删除。
    x_ParseNode函数是根据在文档中给定结点起始字符的偏移量来识别一个结点。出于对速度和简单考虑,结点被分析只是从第一个字符前进做一个简单的循环,在结点的类型被确定前,保持一个比特标志状态。
    如果第一字符是小于号“<”,它就是一个标签“<..>”(对于文本和空格),如果是标签,检查第二个字符,它可能是元素标签名的起始、或者一个斜线(结束标签)、或者是一个感叹号(是注释、CDATA段或DOCTYPE)或是问号(PI),如果是感叹号,你必须要得到下一个字符来判断结点的类型。一旦知道了结点类型,分析器就可以正确扫描这种结点类型相应的结束字符串。
如果第一个字符不是小于号“<”,同时也不空格,那么它是一个文本结点,并且这个结点一直要到一个小于号”<”或者到文档的结束。如果第一个字符是一个空格,那么它也要一直到小于号”<”或文档结束,但是当看到第一个非空格就表明它是一个文本结点。如果到结点的结束都没有遇到非空格,那么,它就是一个空格结点。
现在,让我们这样的步骤来处理下面的简单XML文档。
<?xml version="1.0"?><test> hello world </test>
首先调用x_ParseNode,开始字符是文档的第一个字符,如果是小于号,表明是标签,所以OPENTAG位被设置,下一个字符是一个问号,那么在OPENTAG状态中,表明这是一个处理指令(PI),现在知道了结点类型,不需要设置OPENTAG位了。它会扫描PI的结束字符串 ?>,再返回。
第二步,调用x_ParseNode,开始字符是测试元素的第一个字符,是小于号,表明这是一个标签,所以设置OPENTAG位,下一个字符是一个有效字符,是元素标签名的第一个字符,那么在OPENTAG状态中,意味着这是一个文本结点。现在知道了结点类型,就不需要再设置OPENTAG位了。它会扫描到元素标签的结束字符”>”,接着返回。
第三步,调用x_ParseNode,起始字符是“ Hello World”的第一个字符,这不是小于号了,它是一个空格,所以TEXTORWS (文本或空格)位要被设置。下一个字符是文本字符,所以在EXTORWS 状态中,就意味着这是一个文本结点,现在,解析器知道了结点类型,就不用再设置 TEXTORWS 位了,它会扫描小于号或文档的结束,然后返回。
第四步,调用x_ParseNode,,开始字符是测试元素结束标签的第一个字符,这是一个小于号,表明它是标签,所以要设置OPENTAG位,下一个字符是斜线,在OPENTAG状态中,这意味着它是一个结束标签,现在知道标签的类型了,不用设置OPENTAG位了,它会扫描结束标签的结束字符“>”,然后返回。
 
CMarkup11.2及帮助文档 创建一个新的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编译选项。 立即下载

相关推荐

CMarkup源码 XML创建及解析

简单实用的XML解析源码,开发的时候用到所以研究了下,现在分享出来给大家。 下载后取出里面的Markup.cpp和Markup.h,导入你的工程里面,CMarkup类就可以用了。其中的MSXML是另一套解析源码,主要使用COM,大家可以研究一下,我没用过这个。 另外从网上整理了一些CMark函数简介及相关实例,请点击复制以下链接查看: http://blog.youkuaiyun.com/dongdan_002/article/details/41721477

CMarkup 函数

1、初始化 Load 导入一个XML文件到CMarkup的对象中,并对它进行解析。 SetDoc 从字符串中导入XML数据,并对它解析。 2、输出 Save 将XML数据写入文件中。 GetDoc 将整个XML数据文档作为字符串返回。 3、改变当前位置 FindElem 定位到下一个元素,可能和一个标签名或路径匹配。 FindChildElem 定位到下一个子元素,匹配元素名或路径。 Find...

风飘红技术中心 1362

基于UWB技术的自动跟随避障系统设计研究

基于UWB技术的自动跟随避障系统设计研究 摘要:目前我国针对自动跟随避障系统方面的研究较少,同时国内自动跟随避障系统仍然处在未成熟阶段,多数仍停留在应用蓝牙控制或摄像头捕捉这类跟随方式,但这类方式在实际应用过程中往往会出现易受干扰,精度差,易受环境干扰等问题,这不仅会降低自动跟随避障系统的性能,同时也会对用户造成诸多困扰。因此,就需要结合目前较为有效的UWB技术,对自动跟随避障系统进行设计。基于此,本文首先将会针对UWB技术展开概述,而后对基于UWB技术的自动跟随避障系统组成展开分析,进而对基于UWB技术的

qq_43543515的博客 7992

CMarkup概述

CMarkup概述7.2版本, 2004年9月27日Markup72.zip 422k 原文出自http://www.firstobject.com/dn_markup.htm 创建一个新的XML文档,分析修改现存的XML文档,所有的这些都中可以从一个利用MFC或STL字符串所实现的一个简单类的方法中得到。关于CMarkup,你可以运行Zip文件右边的例子,如果你愿意,你可以通过看源码,几分钟把它

知足者常乐 1万+

别再死记硬背MAML原理了!用PyTorch手撸一个Omniglot小样本分类器(附完整代码)

本文详细介绍了如何使用PyTorch实现MAML(模型无关的元学习)算法,构建一个Omniglot小样本分类器。通过实战代码演示,帮助读者理解MAML的双层优化原理,并提供了完整的训练循环、网络架构设计及调试技巧,适合想要掌握元学习技术的开发者。

weixin_29191669的博客 131

三维(点云)语义分割概述以及方法总结

语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到...

renhaofan的博客 3万+

CMarkup定位解释---深入Markup分析器

CMarkup定位解释 三年前,我写过一篇关于Cmarkup定位的解释,现在我用这篇文章代替那篇。 int nStart; int nLength; int nTagLengths; int nFlags; int iElemParent; int iElemChil...

chenqunan3231的博客 126

PRIDE数据库20年:2025更新

PRoteomics IDEntifications (PRIDE)数据库(https://www.ebi.ac.uk/pride/)是全球领先的基于质谱(MS)的蛋白质组学数据存储库,也是ProteomeXchange联盟的创始成员之一。本文总结了过去3年中PRIDE资源及相关工具的发展情况。提交到PRIDE存档的数据集数量平均每月达到约534个。主要得益于基础设施的持续改进,如用于超大数据集的新文件传输协议(Globus)、新的数据重新提交流程以及自动数据集验证过程。

多组・学・多组学 2064

CMarkup介绍(三)

深入Markup分析器编译者:知足者2004年7月17日原文http://www.firstobject.com/dn_markparser.htm       虽然Markup经常被叫做是“分析器”,但是分析保是Cmarkup功能中的一部分,另外Cmarkup还支持文档的导航、创建和修改,还有其它如文件I/O、字符集及64位编码转换等功能。然而分析器是Cmarkup一个最重要的功能,因为这样可以

知足者常乐 2219

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 551

CMarkUp使用简介

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经打成包供你直接使用了。好在有知道CMarkup这个小型XML的分析器,可以为我所用。俗话说:磨刀不误砍柴工。我现

a564941464的专栏 985

C++ Qt6 qml CMakeLists.txt如何添加qrc文件

本文介绍了在Qt6项目中如何通过CMake管理QML图片资源。相比Qt5的qmake,CMake需要手动创建qrc文件并配置CMakeLists.txt。关键步骤包括:1)创建resources.qrc文件并添加图片资源;2)在CMakeLists.txt中设置CMAKE_AUTORCC为ON开启自动资源处理;3)使用qt_add_resources将qrc文件绑定到项目。配置完成后,可通过"qrc:alias"方式引用资源图片,解决了相对路径管理复杂的问题。

琅嬛福地 1454

c++ xml markup

C++xml文件操作 CMarkup学习方法说明(转) 2009-02-20 12:19:31|分类: c++ |标签: |字号大中小订阅 最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发...

angtuanv07384的博客 81

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 267

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

CMarkup学习之方法说明

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那

MOKA 500

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++xml文件操作 CMarkup学习方法说明(转)

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经打成包供你直接使用了。好在有知道CMarkup这个小型XML的分析器,可以为我所用。俗话说:磨刀不误砍柴工。我现

wen_eric的专栏 845

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C++xml文件操作 CMarkup学习方法说明

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经...

chenqunan3231的博客 77

CMarkUp使用简介,XML读取

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经打成包供你直接使用了。好在有知道CMarkup这个小型XML的分析器,可以为我所用。俗话说:磨刀不误砍柴工。我现

kop看台 672

C++对xml文档操作 CMarkUp

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经打成包供你直接使用了。好在有知道CMarkup这个小型XML的分析器,可以为我所用。俗话说:磨刀不误砍柴工。我现

LT_lover的专栏 725

C++利用CMarkup来解析xml文件

CMarkup这个小型XML的分析器

MachileYuan的专栏 791

CMarkup之类成员函数说明

最近正在研究C++下的XML分析工具CMarkup。初次和XML相遇是基于C#对XML的操作。C#的XmlDocument和XmlNode给我印象之深,让我至今都无法忘怀。现在想在C++下发掘XML的强大,结果却发现建房子你除了需要基本的建设材料外,还需要些而外的工具。不像C#那样,已经打成包供你直接使用了。好在有知道CMarkup这个小型XML的分析器,可以为我所用。俗话说:磨刀不误砍柴工。我现

软件开发杂谈 738

c++使用 CMarkup进行xml操作(夹带 Qt 操作)

CMarkup 是被提供用来给c++ 解析和操作 xml文件,或者xml的string流的一种框架。网站是 http://www.firstobject.com/。下载解析之后,主要使用到的,就是,Markup.cpp 和 Markup.h 文件。 一、CMarkup 添加到工程 ...

qq_38181811的博客 1723
上一篇: Native NT Toolkit
下一篇: 从卡巴漏洞管窥内核模式Shellcode的编写
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值