一、概述

VTD-XML是一种无提取的XML解析方法,它较好的解决了DOM占用内存过大的缺点,并且还提供了快速的解析与遍历、对XPath的支持和增量更新等特性。

二、原理

为了实现non-extractive(非提取)这个目的,它将原XML文件原封不动的以二进制的方式读进内存,连解码都不做,然后在这个二进制byte数组上解析每个 element的位置并把一些信息记录下来,这种记录就被成为VTD(Virtual Token Descriptor,虚拟令牌描述符)。

之后的遍历操作便在这些保存下来的记录上进行,如果需要提取XML内容就利用记录中的位置等 信息在原始byte数组上进行解码并返回字符串。

VTD(Virtual Token Descriptor,虚拟令牌描述符)结构:

VTD是一个64bits定长的数值类型,记录了每个元素的起始位置(offset),长度(length),深度(depth)以及令牌(元素标签)的类型(type)等信息。

如下图,表示了每个元素的位置及类型信息,对Xml的所有操作都是基于这个数据结构:

它是二进制格式规范,而不是API规范

VTD记录是原始数据类型(32位的整数倍),它编码XML文件中令牌的以下参数:

  • 开始偏移
  • 长度
  • 嵌套深度
  • 令牌类型

VTD要求XML文档在内存中保持不变。

我们当前的VTD记录布局进一步指定了以下内容:

  • 使用64位作为基元类型(b63~b0)
  • 大端
  • 起始偏移:30位(b29~b0)最大值为2 ^ 30 -1 = 1G -1
  • 长度:20位(b51~b32)最大值为2 ^ 20-1 = 1M -1
  1. 对于某些令牌类型
  2. 前缀长度:9位(b51~b43)最大值511
  3. Q名长度:11位(b42~b 32)最大值1023

深度:8位(b59~b52)最大值为2 ^ 8-1 = 255

令牌类型:4位(b63~b60)

保留位:2位(b31:b30)

单位 - 因为处理模型在内部存储未解码的XML,所以偏移和长度的单位是编码格式的原始字符。对于UTF-8和ISO-8859,长度和偏移量以字节为单位。对于UTF-16,它们是16位字。

三、VTD的优点和缺点

由于VTD记录的长度不变,因此基于VTD的XML处理可能具有以下优点

节省内存

  • 由于VTD记录不是对象,因此不受每个对象内存开销的影响。
  • VTD存储可以批量分配(即使用大内存块):当分配一个大内存块来存储1024个VTD令牌时,只会产生一次每阵列内存开销,从而大大减少了每个记录的开销。几乎没有。

高性能

  • 使用VTD,我们尝试在解析中实现高性能,这是VTD内存节省功能的副产品:更少的内存使用意味着分配的内存量更少。
  • 大型内存块的分配和GC比许多离散对象更快。请记住,我们处于这项技术的早期阶段。因此,应该期望在性能和可用性方面进一步改进。

固有持久性

  • VTD记录可以保存在磁盘上或沿XML传输,以提高XML处理吞吐量。

增量更新

  • 此功能在最近的文章中有详细解释

同时,需要了解VTD的一些局限性

各种字段的上限

  • (1)对于起始标记(最大Qname长度为2048;前缀512),溢出条件导致解析异常。对于其他令牌(上限为1M),可能会将长令牌分成多个较短的令牌。
  • (2)深度字段溢出条件会导致解析异常。
  • (3)起始偏移:目前支持的最大文档是1G字符(1G字节或2G字节,具体取决于实际的文档编码)。

位级布局的限制

  • 可能需要重新排列位级布局以满足实际处理要求。

VTD令牌长度限制

  • 当前VTD记录的长度为64位。如果64位不够,可以添加另一个32位。

四、VTD-XML与DOM和SAX对比

与DOM相比,VTD-XML显着更快(高达10倍),内存效率更高(高达5倍)。

与SAX / PULL相比,VTD-XML不仅速度更快,而且能够随机访问,因此更易于使用。

五、FAQ

VTD-XML是索引器还是解析器?

VTD-XML同时是解析器和索引器,因为VTD-XML的API直接使用VTD索引来实现解析的目的。

为什么我应该将VTD-XML用于大型XML文件?

由于众多原因总结如下:

性能:VTD-XML的性能远远优于SAX

易于使用:随机访问与XPath结合使应用程序易于编写

更好的可维护性:应用程序代码更短,更易于理解。

增量更新:偶尔的小变化变得非常有效。

索引:预解析形式的XML将进一步提高处理性能。

内存映射:扩展的VTD-XML可以选择内存映射XML文档,从而可以处理大小大于可用物理内存的XML文件。

其他功能:只能使用VTD-XML剪切,粘贴,拆分和组合XML文档。

为了利用VTD-XML,我们建议开发人员将超大型XML文档拆分为更小,更易于管理的卡盘(<2GB)。

自VTD-XML 2.4以来,XimpleWare引入了一个扩展版本的VTD-XML,能够处理大小达256 GB的XML文档。

VTD-XML如何实现随机访问?

通过使用位置缓存(LC),它们本质上是分层元素目录。

位置缓存按每个级别分配; 即,相同的LC索引相同嵌套深度的所有元素。 LC条目是64位整数,其高32位是元素(开始标记)的VTD记录的索引值,并且其低32位指向对应于第一子元素的LC条目。

动机是坚持VTD的获胜策略:恒定令牌长度和固有持久性。

结果:LC成本约为总VTD-XML处理成本的* 10%*。

如果我获得属性名称的VTD索引值,我该如何检索属性值?

如果属性名称的索引值是i,则属性值对应于i + 1。

VTD-XML解析XML入门简介相关推荐

  1. XML——解析XML文档

    [0]README 0.1)本文描述 转自 core java volume 2, 旨在理解 XML--解析XML文档 的基础知识: 0.2) for source code, please visi ...

  2. C++中XML的读写操作(生成XML 解析XML)

    一.用Poco库 Poco库是下载.编译和使用:www.cnblogs.com/htj10/p/11380144.html DOM(The Document Object Model)方式: 1. 生 ...

  3. Simple XML解析XML

    Simple XML解析XML 源数据如下: <rss version="2.0"><channel><item><newsid>3 ...

  4. XML 解析XML文档 XML约束

    XML 什么是XML Extensible Markup Language(可扩展的标记语言) 他是一个语言,有自己的语法,和Java以及其他的编程无关 "标记" 在文件中包含类似 ...

  5. Kettle+WebService+自动获取日期+xml解析并存入Oracle数据库

    于2022年3月8日优化,操作更简单 新文章地址,可互应参考https://blog.csdn.net/RatherI/article/details/123350552https://blog.cs ...

  6. iOS中XML解析汇总

    在时间上TBXML占优,libxml2支持了边下载边解析. 来源:http://www.codeios.com/forum.php?mod=viewthread&tid=9880&hi ...

  7. pythonjava解释xml_Python解析XML文档

    解析XML主要用到pytohn自带的XML库,其次还是lxml库 XML结构,先以一个相对简单但功能比较全的XML文档为例 dive into mark currently between addic ...

  8. xml 属性value换行显示_跟光磊学Java开发-Java解析XML

    XML介绍 XML(EXtensible Markup Language)指的是可扩展的标记语言. XML经常被用于框架的配置文件,例如Mybatis,Spring等开源框架都会使用XML作为配置文件 ...

  9. iOS中XML解析 (一) TBXML (实例:打印xml内容及存储到数组)

    关联:iOS中XML解析 (二) libxml2(实例:打印xml内容及存储到数组) 在时间上TBXML占优,libxml2支持了边下载边解析. 来源:http://www.codeios.com/f ...

  10. Python3解析XML文件(xml.etree.ElementTree)——以简单网络爬虫为例

    文章目录 简单爬虫案例(XML解析)# XML文件生成 本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人,允许禁止转载. ...

最新文章

  1. 扩增子图片解读7三元图:美的不要不要的,再多用也不过分
  2. 优秀的Java程序员必须了解GC的工作原理
  3. R语言应用实战-基于R语言的综合评价(层次分析法AHP为例)
  4. Console Snacks[摘自Advanced Rails Recipes]
  5. 怎么查看linux网关,如何查看linux服务器网关
  6. 我的学习JavaEE路线
  7. Android 加密解密
  8. 中文 哈工大_第六届中文语法错误诊断大赛,哈工大讯飞联合实验室再获多项冠军...
  9. Page.IsPostBack
  10. 安鸾CMS系列之74CMS
  11. 关于PTC保险丝工作原理总结
  12. 「津津乐道播客」#353 编码人声:程序员都是「时间管理大师」
  13. 扩展名是.class.php,php 获取文件扩展名的函数 - strtolower
  14. 京东VC后台自动批量上传主图 大聪明自动传主图 c# selenium网页自动化传图
  15. 估算的合同总价与实际的合同总价
  16. Android SDKManger 更新设置
  17. 今天来聊聊函数function func()
  18. 会声会影2023最新中文旗舰版新功能介绍
  19. 数据ETL——使用R语言对身份证进行校验,排序筛选等操作
  20. linux内核形式化验证,说说形式化验证(Formal Verification)吧

热门文章

  1. linux中怎么卸载gamit,GAMIT 解算各步骤-详细
  2. java微信项目开发教程,Java+微信公众号开发过程步骤详解
  3. EXPRESS语言与IFC体系
  4. predict函数 R_R语言 动态贝叶斯网工具箱 dbnR学习笔记
  5. 学习PLC编程必须要知道的小常识,一起学起来
  6. java私塾初级_Java私塾Java初级教程
  7. 计算机网络(北京理工大学出版社)课后习题答案
  8. [样本分析] Ramnit感染型病毒
  9. AE倒影插件:vc reflect插件汉化版(支持ae2020)
  10. 整合 activiti 7 springcloud