CN107301207A - 一种解析xml的方法及装置 - Google Patents
一种解析xml的方法及装置 Download PDFInfo
- Publication number
- CN107301207A CN107301207A CN201710407995.7A CN201710407995A CN107301207A CN 107301207 A CN107301207 A CN 107301207A CN 201710407995 A CN201710407995 A CN 201710407995A CN 107301207 A CN107301207 A CN 107301207A
- Authority
- CN
- China
- Prior art keywords
- dom tree
- character string
- tree node
- elements
- node structure
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/80—Information retrieval; Database structures therefor; File system structures therefor of semi-structured data, e.g. markup language structured data such as SGML, XML or HTML
- G06F16/81—Indexing, e.g. XML tags; Data structures therefor; Storage structures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Document Processing Apparatus (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出了一种解析XML的方法及装置,该方法包括:定义字符串指示结构;步骤二,定义文档对象模型DOM树节点结构,在所述DOM树节点结构中通过所述字符串指示结构指示XML文档中各元素的字符串,以复用所述XML文档的文本缓冲区;步骤三,通过对所述XML文档的文本缓冲区进行递归解析,使用所述DOM树节点结构构造DOM树。本发明所述一种解析XML的方法及装置,在实现XML文件的DOM树时,在节点数据结构使用外置长度的字符串表示法来指示字符串,从而达到复用XML文件的文本缓冲区的目的;在系统资源敏感的情况下,能够有效地降低内存占用,避免内存的频繁分配释放,从而提高系统的效率;带长度的字符串在进行相应的比较、查找等计算过程中,效率更高。
Description
技术领域
本发明涉及信息处理技术领域,尤其涉及一种解析XML的方法及装置。
背景技术
XML(Extensible Markup Language,可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言。XML具有自我描述性,尤其适合在不同的系统、平台和语言间共享数据,被广泛地应用在各种数据处理、通讯领域和数据存储的软件。
XML DOM(Document Object Model,文档对象模型)是W3C(World Wide WebConsortium,万维网联盟)推荐的访问和操作XML文档的标准方法。DOM通过把XML文档装载到一个树结构中,访问XML中的所有元素,修改或删除XML中的元素,或者在XML中创建新的元素。在XML被装载到DOM树中后,还可以利用XPath(XML路径语言)来方便地定位XML文档中的元素和属性。
XML DOM本质上是在内存中构建一个树型结构,除去XML节点内容的内存占用,树结构本身也需要一定量的内存占用。例如:一个100KB的XML文档中有100个元素,每个元素里包含了1K的字符串,那么装载到DOM树中后,至少也需要100KB+100×nB的内存,其中n是每个树节点数据结构占用的内存,而通常情况下,XML文档本身作为字符串也是在内存中的,所以在构造DOM时,实际上的内存占用至少为100KB+100KB+100×nB,除此之外,还会因内存复制操作而产生相应的CPU(Central Processing Unit,中央处理器)占用。在处理大型XML文档时内存占用和CPU占用尤其明显。在一些资源敏感的环境下,例如操作系统内核模式和嵌入式系统中,内存是相对宝贵的,使用DOM解析XML会占用大量内存,对系统造成较大的影响。
SAX(Simple API for XML)是一种轻量型的解析XML方法。SAX将XML文档视作一个流,采用事件驱动方式,在读取流的过程中,适时地激发回调(callback)以处理节点内容。SAX不同于DOM,不必在内存中装载整个文档,由此可以节约内存损耗。SAX适用于读取大型的和结构确定的XML文档。
但SAX不支持解析复杂的XML,例如修改元素的内容、XSLT(ExtensibleStylesheet Language Transformations,扩展样式表转换语言)转换和XPath查询等。同时,SAX在使用XML封装RPC(Remote Procedure Call Protocol,远程过程调用协议)调用等情况下,不适用于解析XML。
发明内容
本发明要解决的技术问题是,提供一种解析XML的方法及装置,克服现有的技术中解析复制的XML占用系统内存过多的缺陷。
本发明采用的技术方案是,所述解析可扩展标记语言XML的方法,包括:
步骤一,定义字符串指示结构;所述字符串指示结构包括:所述字符串的内容长度Length、所述字符串的缓冲区指针Buffer和所述字符串缓冲区的内存分配标记MaximumLength;
步骤二,定义文档对象模型DOM树节点结构,在所述DOM树节点结构中通过所述字符串指示结构指示XML文档中各元素的字符串,以复用所述XML文档的文本缓冲区;
步骤三,通过对所述XML文档的文本缓冲区进行递归解析,使用所述DOM树节点结构构造DOM树。
进一步的,所述DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
所述元素Name成员的类型为所述字符串指示结构;
所述元素Content成员的类型为所述字符串指示结构;
所述元素Attributes成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
进一步的,所述步骤三,具体包括:
步骤A1,在所述XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],所述M为所述XML文档中元素的总数;
步骤A2,判断所述第i元素是所述XML文档中的根元素还是所述根元素嵌套的子元素;若判定所述第i元素是所述XML文档中的根元素,则分配所述根元素对应的DOM树节点结构;若判定所述第i元素是所述根元素嵌套的子元素,则分配所述子元素对应的DOM树节点结构;
步骤A3,在所述第i元素的开始标记中,提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员;
其中,所述提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为所述第i元素的元素Name字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为所述第i元素的元素Name字符串的长度len;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为所述第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A4,在所述第i元素有元素Attributes的情况下,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员;所述j∈[1,N],所述N为所述第i元素中的元素Attributes字符串的总数;
其中,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为所述第i元素的第j元素Attributes字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为所述第i元素的第j元素Attributes字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为所述第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A5,在所述第i元素有元素Content的情况下,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员;所述k∈[1,H],所述H为所述第i元素中的元素Content字符串的总数;
其中,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为所述第i元素的第k元素Content字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为所述第i元素的第k元素Content字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为所述第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
进一步的,所述方法还包括:
步骤四,通过对所述DOM树节点结构的搜索和定位,对所述XML文档进行读取。
进一步的,所述方法还包括:
步骤五,在更新所述XML文档中的第l元素,且所述第l元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述第l元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述第l元素的字符串实际长度,以通过MaximumLength等于所述第l元素的字符串实际长度指示所述第l元素对应的字符串指示结构指示的字符串缓冲区不是复用的;其中,l∈[1,M];
或者,在插入所述XML文档中的新元素,且所述新元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述新元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述新元素的字符串实际长度,以通过MaximumLength等于所述新元素的字符串实际长度指示所述新元素对应的字符串指示结构指示的字符串缓冲区不是复用的;
步骤六,当析构所述DOM树时,在所述DOM树中第p个DOM树节点结构类型为UNICODE_STRING类型的成员的情况下,判断所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength是否大于所述第p个DOM树节点结构中的字符串指示结构中的Length;其中,p∈[1,M];
若判定所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength大于所述第p个DOM树节点结构中的字符串指示结构中的Length;则释放第p个DOM树节点结构中的字符串指示结构中的Buffer;
否则不释放第p个DOM树节点结构中的字符串指示结构中的Buffer。
本发明还提供一种解析XML的装置,包括:
第一定义模块,用于定义字符串指示结构;所述字符串指示结构包括:所述字符串的内容长度Length、所述字符串的缓冲区指针Buffer和所述字符串缓冲区的内存分配标记MaximumLength;
第二定义模块,用于定义文档对象模型DOM树节点结构,在所述DOM树节点结构中通过所述字符串指示结构指示XML文档中各元素的字符串,以复用所述XML文档的文本缓冲区;
构造模块,用于通过对所述XML文档的文本缓冲区进行递归解析,使用所述DOM树节点结构构造DOM树。
进一步的,所述DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
所述元素Name成员的类型为所述字符串指示结构;
所述元素Content成员的类型为所述字符串指示结构;
所述元素Attributes成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
进一步的,所述构造模块,包括:
查询模块,用于在所述XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],所述M为所述XML文档中元素的总数;
分配模块,用于判断所述第i元素是所述XML文档中的根元素还是所述根元素嵌套的子元素;若判定所述第i元素是所述XML文档中的根元素,则分配所述根元素对应的DOM树节点结构;若判定所述第i元素是所述根元素嵌套的子元素,则分配所述子元素对应的DOM树节点结构;
名称模块,用于在所述第i元素的开始标记中,提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员;
其中,所述提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为所述第i元素的元素Name字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为所述第i元素的元素Name字符串的长度len;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为所述第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
属性模块,用于在所述第i元素有元素Attributes的情况下,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员;所述j∈[1,N],所述N为所述第i元素中的元素Attributes字符串的总数;
其中,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为所述第i元素的第j元素Attributes字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为所述第i元素的第j元素Attributes字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为所述第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
内容模块,用于在所述第i元素有元素Content的情况下,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员;所述k∈[1,H],所述H为所述第i元素中的元素Content字符串的总数;
其中,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为所述第i元素的第k元素Content字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为所述第i元素的第k元素Content字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为所述第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
进一步的,所述装置还包括:
读取模块,用于所述构造模块使用所述DOM树节点结构构造DOM树之后,通过对所述DOM树节点结构的搜索和定位,对所述XML文档进行读取。
进一步的,所述装置还包括:
修改模块,用于所述构造模块使用所述DOM树节点结构构造DOM树之后,在更新所述XML文档中的第l元素,且所述第l元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述第l元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述第l元素的字符串实际长度,以通过MaximumLength等于所述第l元素的字符串实际长度指示所述第l元素对应的字符串指示结构指示的字符串缓冲区不是复用的;其中,l∈[1,M];
或者,在插入所述XML文档中的新元素,且所述新元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述新元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述新元素的字符串实际长度,以通过MaximumLength等于所述新元素的字符串实际长度指示所述新元素对应的字符串指示结构指示的字符串缓冲区不是复用的;
析构模块,用于所述构造模块使用所述DOM树节点结构构造DOM树之后,当析构所述DOM树时,在所述DOM树中第p个DOM树节点结构类型为UNICODE_STRING类型的成员的情况下,判断所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength是否大于所述第p个DOM树节点结构中的字符串指示结构中的Length;其中,p∈[1,M];
若判定所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength大于所述第p个DOM树节点结构中的字符串指示结构中的Length;则释放第p个DOM树节点结构中的字符串指示结构中的Buffer;
否则不释放第p个DOM树节点结构中的字符串指示结构中的Buffer。
采用上述技术方案,本发明至少具有下列优点:
本发明所述一种解析XML的方法及装置,在实现XML文件的DOM树时,在节点数据结构使用外置长度的字符串表示法来指示字符串,从而达到复用XML文件的文本缓冲区的目的;在系统资源敏感的情况下,能够有效地降低内存占用,避免内存的频繁分配释放,从而提高系统的效率;带长度的字符串在进行相应的比较、查找等计算过程中,效率更高,CPU占用率更少;通过鉴别字符串的缓冲区是否源于复用缓冲区,作为DOM树在析构时字符串是否需要释放缓冲区的依据。
附图说明
图1为本发明第一实施例的解析XML的方法流程图;
图2为本发明第三实施例的解析XML的装置组成结构示意图;
图3为本发明第三实施例的构造模块300组成结构示意图;
图4为本发明第四实施例的解析XML的装置组成结构示意图。
具体实施方式
为更进一步阐述本发明为达成预定目的所采取的技术手段及功效,以下结合附图及较佳实施例,对本发明进行详细说明如后。
本发明第一实施例,一种解析XML的方法,如图1所示,包括以下具体步骤:
步骤S101,定义字符串指示结构。
其中,字符串指示结构包括:字符串的内容长度Length、字符串的缓冲区指针Buffer和字符串缓冲区的内存分配标记MaximumLength。
例如:
又如,使用Windows本机结构UNICODE_STRING:
步骤S102,定义文档对象模型DOM树节点结构,在DOM树节点结构中通过字符串指示结构指示XML文档中各元素的字符串,以复用XML文档的文本缓冲区。
其中,DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
元素Name成员的类型为字符串指示结构;
元素Content成员的类型为字符串指示结构;
元素Attributes成员的类型为指向DOM树节点结构的指针;
元素Relationship成员的类型为指向DOM树节点结构的指针;
元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
例如:使用UNICODE_STRING结构定义如下的DOM树节点结构:
步骤S103,通过对XML文档的文本缓冲区进行递归解析,使用DOM树节点结构构造DOM树。、
可选的,步骤S103,包括:
步骤A1,在XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],M为XML文档中元素的总数;
步骤A2,判断第i元素是XML文档中的根元素还是根元素嵌套的子元素;若判定第i元素是XML文档中的根元素,则分配根元素对应的DOM树节点结构;若判定第i元素是根元素嵌套的子元素,则分配子元素对应的DOM树节点结构;
步骤A3,在第i元素的开始标记中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员;
其中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为第i元素的元素Name字符串的起始指针start;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为第i元素的元素Name字符串的长度len;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A4,在第i元素有元素Attributes的情况下,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员;j∈[1,N],N为第i元素中的元素Attributes字符串的总数;
其中,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为第i元素的第j元素Attributes字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为第i元素的第j元素Attributes字符串的长度len;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A5,在第i元素有元素Content的情况下,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员;k∈[1,H],H为第i元素中的元素Content字符串的总数;
其中,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为第i元素的第k元素Content字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为第i元素的第k元素Content字符串的长度len;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
本发明第一实施例所述的一种解析XML的方法,在实现XML文件的DOM树时,在节点数据结构使用外置长度的字符串表示法来指示字符串,从而达到复用XML文件的文本缓冲区的目的;在系统资源敏感的情况下,能够有效地降低内存占用,避免内存的频繁分配释放,从而提高系统的效率;带长度的字符串在进行相应的比较、查找等计算过程中,效率更高,CPU占用率更少;通过鉴别字符串的缓冲区是否源于复用缓冲区,作为DOM树在析构时字符串是否需要释放缓冲区的依据。
本发明第二实施例,一种解析XML的方法,包括以下具体步骤:
步骤S201,定义字符串指示结构。
其中,字符串指示结构包括:字符串的内容长度Length、字符串的缓冲区指针Buffer和字符串缓冲区的内存分配标记MaximumLength。
步骤S202,定义文档对象模型DOM树节点结构,在DOM树节点结构中通过字符串指示结构指示XML文档中各元素的字符串,以复用XML文档的文本缓冲区。
其中,DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
元素Name成员的类型为字符串指示结构;
元素Content成员的类型为字符串指示结构;
元素Attributes成员的类型为指向DOM树节点结构的指针;
元素Relationship成员的类型为指向DOM树节点结构的指针;
元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
步骤S203,通过对XML文档的文本缓冲区进行递归解析,使用DOM树节点结构构造DOM树。、
可选的,步骤S203,包括:
步骤A1,在XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],M为XML文档中元素的总数;
步骤A2,判断第i元素是XML文档中的根元素还是根元素嵌套的子元素;若判定第i元素是XML文档中的根元素,则分配根元素对应的DOM树节点结构;若判定第i元素是根元素嵌套的子元素,则分配子元素对应的DOM树节点结构;
步骤A3,在第i元素的开始标记中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员;
其中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为第i元素的元素Name字符串的起始指针start;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为第i元素的元素Name字符串的长度len;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A4,在第i元素有元素Attributes的情况下,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员;j∈[1,N],N为第i元素中的元素Attributes字符串的总数;
其中,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为第i元素的第j元素Attributes字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为第i元素的第j元素Attributes字符串的长度len;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A5,在第i元素有元素Content的情况下,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员;k∈[1,H],H为第i元素中的元素Content字符串的总数;
其中,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为第i元素的第k元素Content字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为第i元素的第k元素Content字符串的长度len;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
步骤S204,通过对DOM树节点结构的搜索和定位,对XML文档进行读取。
步骤S205,在更新XML文档中的第l元素,且第l元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将第l元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为第l元素的字符串实际长度,以通过MaximumLength等于第l元素的字符串实际长度指示第l元素对应的字符串指示结构指示的字符串缓冲区不是复用的;其中,l∈[1,M];
或者,在插入XML文档中的新元素,且新元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将新元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为新元素的字符串实际长度,以通过MaximumLength等于新元素的字符串实际长度指示新元素对应的字符串指示结构指示的字符串缓冲区不是复用的。
步骤S206,当析构DOM树时,在DOM树中第p个DOM树节点结构类型为UNICODE_STRING类型的成员的情况下,判断第p个DOM树节点结构中的字符串指示结构中的MaximumLength是否大于第p个DOM树节点结构中的字符串指示结构中的Length;其中,p∈[1,M];
若判定第p个DOM树节点结构中的字符串指示结构中的MaximumLength大于第p个DOM树节点结构中的字符串指示结构中的Length;则释放第p个DOM树节点结构中的字符串指示结构中的Buffer;
否则不释放第p个DOM树节点结构中的字符串指示结构中的Buffer。
本发明第二实施例所述的一种解析XML的方法,在实现XML文件的DOM树时,在节点数据结构使用外置长度的字符串表示法来指示字符串,从而达到复用XML文件的文本缓冲区的目的;在系统资源敏感的情况下,能够有效地降低内存占用,避免内存的频繁分配释放,从而提高系统的效率;带长度的字符串在进行相应的比较、查找等计算过程中,效率更高,CPU占用率更少;通过鉴别字符串的缓冲区是否源于复用缓冲区,作为DOM树在析构时字符串是否需要释放缓冲区的依据。
本发明第三实施例,一种解析XML的装置,如图2~图3所示,包括以下组成部分:
第一定义模块100,用于定义字符串指示结构。
其中,字符串指示结构包括:字符串的内容长度Length、字符串的缓冲区指针Buffer和字符串缓冲区的内存分配标记MaximumLength。
例如:
又如,使用Windows本机结构UNICODE_STRING:
第二定义模块200,用于定义文档对象模型DOM树节点结构,在DOM树节点结构中通过字符串指示结构指示XML文档中各元素的字符串,以复用XML文档的文本缓冲区。
其中,DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
元素Name成员的类型为字符串指示结构;
元素Content成员的类型为字符串指示结构;
元素Attributes成员的类型为指向DOM树节点结构的指针;
元素Relationship成员的类型为指向DOM树节点结构的指针;
元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
例如:使用UNICODE_STRING结构定义如下的DOM树节点结构:
构造模块300,用于通过对XML文档的文本缓冲区进行递归解析,使用DOM树节点结构构造DOM树。、
可选的,如图3所示,构造模块300,包括:
查询模块301,用于在XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],M为XML文档中元素的总数;
分配模块302,用于判断第i元素是XML文档中的根元素还是根元素嵌套的子元素;若判定第i元素是XML文档中的根元素,则分配根元素对应的DOM树节点结构;若判定第i元素是根元素嵌套的子元素,则分配子元素对应的DOM树节点结构;
名称模块303,用于在第i元素的开始标记中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员;
其中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为第i元素的元素Name字符串的起始指针start;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为第i元素的元素Name字符串的长度len;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
属性模块304,用于在第i元素有元素Attributes的情况下,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员;j∈[1,N],N为第i元素中的元素Attributes字符串的总数;
其中,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为第i元素的第j元素Attributes字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为第i元素的第j元素Attributes字符串的长度len;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
内容模块305,用于在第i元素有元素Content的情况下,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员;k∈[1,H],H为第i元素中的元素Content字符串的总数;
其中,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为第i元素的第k元素Content字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为第i元素的第k元素Content字符串的长度len;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
本发明第三实施例所述的一种解析XML的装置,在实现XML文件的DOM树时,在节点数据结构使用外置长度的字符串表示法来指示字符串,从而达到复用XML文件的文本缓冲区的目的;在系统资源敏感的情况下,能够有效地降低内存占用,避免内存的频繁分配释放,从而提高系统的效率;带长度的字符串在进行相应的比较、查找等计算过程中,效率更高,CPU占用率更少;通过鉴别字符串的缓冲区是否源于复用缓冲区,作为DOM树在析构时字符串是否需要释放缓冲区的依据。
本发明第四实施例,一种解析XML的装置,如图4所示,包括以下组成部分:
第一定义模块100,用于定义字符串指示结构。
其中,字符串指示结构包括:字符串的内容长度Length、字符串的缓冲区指针Buffer和字符串缓冲区的内存分配标记MaximumLength。
第二定义模块200,用于定义文档对象模型DOM树节点结构,在DOM树节点结构中通过字符串指示结构指示XML文档中各元素的字符串,以复用XML文档的文本缓冲区。
其中,DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
元素Name成员的类型为字符串指示结构;
元素Content成员的类型为字符串指示结构;
元素Attributes成员的类型为指向DOM树节点结构的指针;
元素Relationship成员的类型为指向DOM树节点结构的指针;
元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
构造模块300,用于通过对XML文档的文本缓冲区进行递归解析,使用DOM树节点结构构造DOM树。、
可选的,构造模块300,包括:
查询模块301,用于在XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],M为XML文档中元素的总数;
分配模块302,用于判断第i元素是XML文档中的根元素还是根元素嵌套的子元素;若判定第i元素是XML文档中的根元素,则分配根元素对应的DOM树节点结构;若判定第i元素是根元素嵌套的子元素,则分配子元素对应的DOM树节点结构;
名称模块303,用于在第i元素的开始标记中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员;
其中,提取第i元素的元素Name字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为第i元素的元素Name字符串的起始指针start;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为第i元素的元素Name字符串的长度len;
将第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
属性模块304,用于在第i元素有元素Attributes的情况下,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员;j∈[1,N],N为第i元素中的元素Attributes字符串的总数;
其中,提取第i元素的第j元素Attributes字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为第i元素的第j元素Attributes字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为第i元素的第j元素Attributes字符串的长度len;
将第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
内容模块305,用于在第i元素有元素Content的情况下,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员;k∈[1,H],H为第i元素中的元素Content字符串的总数;
其中,提取第i元素的第k元素Content字符串的起始指针start和长度len设置到第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为第i元素的第k元素Content字符串的起始指针start;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为第i元素的第k元素Content字符串的长度len;
将第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
读取模块400,用于通过对DOM树节点结构的搜索和定位,对XML文档进行读取。
修改模块500,用于在更新XML文档中的第l元素,且第l元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将第l元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为第l元素的字符串实际长度,以通过MaximumLength等于第l元素的字符串实际长度指示第l元素对应的字符串指示结构指示的字符串缓冲区不是复用的;其中,l∈[1,M];
或者,在插入XML文档中的新元素,且新元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将新元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为新元素的字符串实际长度,以通过MaximumLength等于新元素的字符串实际长度指示新元素对应的字符串指示结构指示的字符串缓冲区不是复用的。
析构模块600,用于当析构DOM树时,在DOM树中第p个DOM树节点结构类型为UNICODE_STRING类型的成员的情况下,判断第p个DOM树节点结构中的字符串指示结构中的MaximumLength是否大于第p个DOM树节点结构中的字符串指示结构中的Length;其中,p∈[1,M];
若判定第p个DOM树节点结构中的字符串指示结构中的MaximumLength大于第p个DOM树节点结构中的字符串指示结构中的Length;则释放第p个DOM树节点结构中的字符串指示结构中的Buffer;
否则不释放第p个DOM树节点结构中的字符串指示结构中的Buffer。
本发明第四实施例所述的一种解析XML的装置,在实现XML文件的DOM树时,在节点数据结构使用外置长度的字符串表示法来指示字符串,从而达到复用XML文件的文本缓冲区的目的;在系统资源敏感的情况下,能够有效地降低内存占用,避免内存的频繁分配释放,从而提高系统的效率;带长度的字符串在进行相应的比较、查找等计算过程中,效率更高,CPU占用率更少;通过鉴别字符串的缓冲区是否源于复用缓冲区,作为DOM树在析构时字符串是否需要释放缓冲区的依据。
通过具体实施方式的说明,应当可对本发明为达成预定目的所采取的技术手段及功效得以更加深入且具体的了解,然而所附图示仅是提供参考与说明之用,并非用来对本发明加以限制。
Claims (10)
1.一种解析可扩展标记语言XML的方法,其特征在于,包括:
步骤一,定义字符串指示结构;所述字符串指示结构包括:所述字符串的内容长度Length、所述字符串的缓冲区指针Buffer和所述字符串缓冲区的内存分配标记MaximumLength;
步骤二,定义文档对象模型DOM树节点结构,在所述DOM树节点结构中通过所述字符串指示结构指示XML文档中各元素的字符串,以复用所述XML文档的文本缓冲区;
步骤三,通过对所述XML文档的文本缓冲区进行递归解析,使用所述DOM树节点结构构造DOM树。
2.根据权利要求1所述的方法,其特征在于,所述DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
所述元素Name成员的类型为所述字符串指示结构;
所述元素Content成员的类型为所述字符串指示结构;
所述元素Attributes成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
3.根据权利要求2所述的方法,其特征在于,所述步骤三,具体包括:
步骤A1,在所述XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],所述M为所述XML文档中元素的总数;
步骤A2,判断所述第i元素是所述XML文档中的根元素还是所述根元素嵌套的子元素;若判定所述第i元素是所述XML文档中的根元素,则分配所述根元素对应的DOM树节点结构;若判定所述第i元素是所述根元素嵌套的子元素,则分配所述子元素对应的DOM树节点结构;
步骤A3,在所述第i元素的开始标记中,提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员;
其中,所述提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为所述第i元素的元素Name字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为所述第i元素的元素Name字符串的长度len;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为所述第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A4,在所述第i元素有元素Attributes的情况下,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员;所述j∈[1,N],所述N为所述第i元素中的元素Attributes字符串的总数;
其中,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为所述第i元素的第j元素Attributes字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为所述第i元素的第j元素Attributes字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为所述第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
步骤A5,在所述第i元素有元素Content的情况下,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员;所述k∈[1,H],所述H为所述第i元素中的元素Content字符串的总数;
其中,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为所述第i元素的第k元素Content字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为所述第i元素的第k元素Content字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为所述第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
步骤四,通过对所述DOM树节点结构的搜索和定位,对所述XML文档进行读取。
5.根据权利要求3所述的方法,其特征在于,所述方法还包括:
步骤五,在更新所述XML文档中的第l元素,且所述第l元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述第l元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述第l元素的字符串实际长度,以通过MaximumLength等于所述第l元素的字符串实际长度指示所述第l元素对应的字符串指示结构指示的字符串缓冲区不是复用的;其中,l∈[1,M];
或者,在插入所述XML文档中的新元素,且所述新元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述新元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述新元素的字符串实际长度,以通过MaximumLength等于所述新元素的字符串实际长度指示所述新元素对应的字符串指示结构指示的字符串缓冲区不是复用的;
步骤六,当析构所述DOM树时,在所述DOM树中第p个DOM树节点结构类型为UNICODE_STRING类型的成员的情况下,判断所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength是否大于所述第p个DOM树节点结构中的字符串指示结构中的Length;其中,p∈[1,M];
若判定所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength大于所述第p个DOM树节点结构中的字符串指示结构中的Length;则释放第p个DOM树节点结构中的字符串指示结构中的Buffer;
否则不释放第p个DOM树节点结构中的字符串指示结构中的Buffer。
6.一种解析XML的装置,其特征在于,包括:
第一定义模块,用于定义字符串指示结构;所述字符串指示结构包括:所述字符串的内容长度Length、所述字符串的缓冲区指针Buffer和所述字符串缓冲区的内存分配标记MaximumLength;
第二定义模块,用于定义文档对象模型DOM树节点结构,在所述DOM树节点结构中通过所述字符串指示结构指示XML文档中各元素的字符串,以复用所述XML文档的文本缓冲区;
构造模块,用于通过对所述XML文档的文本缓冲区进行递归解析,使用所述DOM树节点结构构造DOM树。
7.根据权利要求6所述的装置,其特征在于,所述DOM树节点结构包括:元素名称Name成员、元素文本内容Content成员、元素属性链表Attributes成员和元素关系Relationship成员;
所述元素Name成员的类型为所述字符串指示结构;
所述元素Content成员的类型为所述字符串指示结构;
所述元素Attributes成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员的类型为指向所述DOM树节点结构的指针;
所述元素Relationship成员包括:父Parent元素成员、子Child元素成员、兄Prev元素成员和弟Next元素成员。
8.根据权利要求7所述的装置,其特征在于,所述构造模块,包括:
查询模块,用于在所述XML文档的文本缓冲区中查询第i元素的开始标记;其中,i∈[1,M],所述M为所述XML文档中元素的总数;
分配模块,用于判断所述第i元素是所述XML文档中的根元素还是所述根元素嵌套的子元素;若判定所述第i元素是所述XML文档中的根元素,则分配所述根元素对应的DOM树节点结构;若判定所述第i元素是所述根元素嵌套的子元素,则分配所述子元素对应的DOM树节点结构;
名称模块,用于在所述第i元素的开始标记中,提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员;
其中,所述提取所述第i元素的元素Name字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的元素Name成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Buffer设置为所述第i元素的元素Name字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的Length设置为所述第i元素的元素Name字符串的长度len;
将所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构中的MaximumLength设置为所述第i元素的元素Name字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的元素Name成员的字符串指示结构指示的字符串缓冲区是复用的;
属性模块,用于在所述第i元素有元素Attributes的情况下,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员;所述j∈[1,N],所述N为所述第i元素中的元素Attributes字符串的总数;
其中,提取所述第i元素的第j元素Attributes字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第j元素Attributes成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Buffer设置为所述第i元素的第j元素Attributes字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的Length设置为所述第i元素的第j元素Attributes字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构中的MaximumLength设置为所述第i元素的第j元素Attributes字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第j元素Attributes成员的字符串指示结构指示的字符串缓冲区是复用的;
内容模块,用于在所述第i元素有元素Content的情况下,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员;所述k∈[1,H],所述H为所述第i元素中的元素Content字符串的总数;
其中,提取所述第i元素的第k元素Content字符串的起始指针start和长度len设置到所述第i元素对应的DOM树节点结构的第k元素Content成员的方式,包括:
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Buffer设置为所述第i元素的第k元素Content字符串的起始指针start;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的Length设置为所述第i元素的第k元素Content字符串的长度len;
将所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构中的MaximumLength设置为所述第i元素的第k元素Content字符串的长度len,通过MaximumLength等于Length指示所述第i元素对应的DOM树节点结构中的第k元素Content成员的字符串指示结构指示的字符串缓冲区是复用的。
9.根据权利要求8所述的装置,其特征在于,所述装置还包括:
读取模块,用于所述构造模块使用所述DOM树节点结构构造DOM树之后,通过对所述DOM树节点结构的搜索和定位,对所述XML文档进行读取。
10.根据权利要求8所述的装置,其特征在于,所述装置还包括:
修改模块,用于所述构造模块使用所述DOM树节点结构构造DOM树之后,在更新所述XML文档中的第l元素,且所述第l元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述第l元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述第l元素的字符串实际长度,以通过MaximumLength等于所述第l元素的字符串实际长度指示所述第l元素对应的字符串指示结构指示的字符串缓冲区不是复用的;其中,l∈[1,M];
或者,在插入所述XML文档中的新元素,且所述新元素对应的DOM树节点结构的字符串缓冲区是新分配的字符串缓冲区的情况下,将所述新元素对应的DOM树节点结构中的字符串指示结构中的MaximumLength设置为所述新元素的字符串实际长度,以通过MaximumLength等于所述新元素的字符串实际长度指示所述新元素对应的字符串指示结构指示的字符串缓冲区不是复用的;
析构模块,用于所述构造模块使用所述DOM树节点结构构造DOM树之后,当析构所述DOM树时,在所述DOM树中第p个DOM树节点结构类型为UNICODE_STRING类型的成员的情况下,判断所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength是否大于所述第p个DOM树节点结构中的字符串指示结构中的Length;其中,p∈[1,M];
若判定所述第p个DOM树节点结构中的字符串指示结构中的MaximumLength大于所述第p个DOM树节点结构中的字符串指示结构中的Length;则释放第p个DOM树节点结构中的字符串指示结构中的Buffer;
否则不释放第p个DOM树节点结构中的字符串指示结构中的Buffer。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710407995.7A CN107301207B (zh) | 2017-06-02 | 2017-06-02 | 一种解析xml的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710407995.7A CN107301207B (zh) | 2017-06-02 | 2017-06-02 | 一种解析xml的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107301207A true CN107301207A (zh) | 2017-10-27 |
CN107301207B CN107301207B (zh) | 2020-04-17 |
Family
ID=60134602
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710407995.7A Active CN107301207B (zh) | 2017-06-02 | 2017-06-02 | 一种解析xml的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107301207B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020168521A1 (zh) * | 2019-02-21 | 2020-08-27 | 华为技术有限公司 | 报文解析的方法、数据发送端、数据接收端和系统 |
CN112182310A (zh) * | 2020-11-04 | 2021-01-05 | 上海德拓信息技术股份有限公司 | 一种内置实时搜索的通用树形组件实现方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1601969A (zh) * | 2003-09-24 | 2005-03-30 | 华为技术有限公司 | 一种设备配置信息解析方法 |
CN102394874A (zh) * | 2011-10-26 | 2012-03-28 | 深圳天源迪科信息技术股份有限公司 | Tuxedo数据协议转换方法 |
CN102508887A (zh) * | 2011-10-19 | 2012-06-20 | 江西省南城县网信电子有限公司 | 一种数字电视交互服务标记语言解析系统及方法 |
CN104158692A (zh) * | 2014-08-25 | 2014-11-19 | 烽火通信科技股份有限公司 | 基于xml实现家庭网关数据配置管理的方法 |
-
2017
- 2017-06-02 CN CN201710407995.7A patent/CN107301207B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1601969A (zh) * | 2003-09-24 | 2005-03-30 | 华为技术有限公司 | 一种设备配置信息解析方法 |
CN102508887A (zh) * | 2011-10-19 | 2012-06-20 | 江西省南城县网信电子有限公司 | 一种数字电视交互服务标记语言解析系统及方法 |
CN102394874A (zh) * | 2011-10-26 | 2012-03-28 | 深圳天源迪科信息技术股份有限公司 | Tuxedo数据协议转换方法 |
CN104158692A (zh) * | 2014-08-25 | 2014-11-19 | 烽火通信科技股份有限公司 | 基于xml实现家庭网关数据配置管理的方法 |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020168521A1 (zh) * | 2019-02-21 | 2020-08-27 | 华为技术有限公司 | 报文解析的方法、数据发送端、数据接收端和系统 |
US11956337B2 (en) | 2019-02-21 | 2024-04-09 | Huawei Technologies Co., Ltd. | Message parsing method, data transmit end, data receive end, and system |
CN112182310A (zh) * | 2020-11-04 | 2021-01-05 | 上海德拓信息技术股份有限公司 | 一种内置实时搜索的通用树形组件实现方法 |
CN112182310B (zh) * | 2020-11-04 | 2023-11-17 | 上海德拓信息技术股份有限公司 | 一种内置实时搜索的通用树形组件实现方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107301207B (zh) | 2020-04-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP2021957B1 (en) | Efficient piece-wise updates of binary encoded xml data | |
CA2412318C (en) | Method and apparatus for efficient management of xml documents | |
US20060107206A1 (en) | Form related data reduction | |
US20050097128A1 (en) | Method for scalable, fast normalization of XML documents for insertion of data into a relational database | |
CN104753540B (zh) | 数据压缩方法、数据解压方法和装置 | |
CN101361063B (zh) | 支持基于规则的文档内容挖掘的系统与方法 | |
HRP20030524A2 (en) | Word-processing document stored in a single xml file | |
US20180330111A1 (en) | Device with communication interface and method for controlling database access | |
US20020147748A1 (en) | Extensible stylesheet designs using meta-tag information | |
US20070005622A1 (en) | Method and apparatus for lazy construction of XML documents | |
US20040088415A1 (en) | Techniques for scalably accessing data in an arbitrarily large document by a device with limited resources | |
US20120310868A1 (en) | Method and system for extracting and managing information contained in electronic documents | |
WO2006116650A2 (en) | Method, system and apparatus for a transformation engine for use in the processing of structured documents | |
CN101346689A (zh) | 压缩模式表示对象和用于元数据处理的方法 | |
CN107092625A (zh) | 数据配置方法、数据处理方法及装置 | |
CN107301207A (zh) | 一种解析xml的方法及装置 | |
US7299237B1 (en) | Dynamically pipelined data migration | |
CN102937998A (zh) | 一种应用于标识识别的元数据映射方法 | |
US20190108393A1 (en) | Method and apparatus for retrieving image-text block from web page | |
US20190377780A1 (en) | Automated patent preparation | |
CN105589918B (zh) | 一种提取页面信息的方法及装置 | |
EP1744253A1 (en) | Document processing device and document processing method | |
US20050210375A1 (en) | Apparatus, method, and program for integrating documents | |
CN101996161A (zh) | 一种电子文档的历史版本数据处理方法及装置 | |
CN111475679B (zh) | Html文档处理方法、页面显示方法和设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |