VTD解析XML( VTDGen、AutoPilot )
转载:【https://blog.csdn.net/JAVA_8206/article/details/52084846】
转载:【https://blog.csdn.net/phiill_01/article/details/8727292】
代码 + 理论
代码部分
VTD解析xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<body><id>0001</id><name>zhangsan</name><records><record><school>frist</school></record><record><school>second</school></record></records>
</body>
取出record下的school中的信息
public static void main(String[] args) {try {VTDGen gen = new VTDGen();// 解析student.xml对象,不含有命名空间gen.parseFile("e:\\student.xml", false);VTDNav nav = gen.getNav();AutoPilot ap = new AutoPilot();AutoPilot ape = new AutoPilot();// 将导航器绑定到ap对像上// 如果把VTDNav表达为车辆上导航仪器的话,那么Autoap就代表开车人,他能更智能化的找到XPATH表达的含义ap.bind(nav);ape.bind(nav);// 设置重新设置一个xpath表达式的字符串,但是通常是在之后调用ape.selectXPath("/body/records/record");List<String> records = new ArrayList<String>();String school= "" ;// evalXPath()返回nodeset集合中的下一个节点,如果检测到为匹配的节点,则返回为-1while(ape.evalXPath() != -1){ap.selectXPath("school");school= ap.evalXPathToString();records.add(school);}ape.resetXPath();for(String s : records){System.out.println("===" + s);}} catch (Exception ex) {ex.printStackTrace();}
}
理论部分
【原理】
1、将XML文件以字节流的方式读取到内存中。
2、判断文件的编码,用相应的编码来获取字符
3、对字符解析构建一个VTD格式的数据结构,来保存XML文件的一些信息
4、从VTD数据结构来获取相应的信息
1 以一个byte数组开始(存放xml);
2 利用VTDGen进行解析
3 利用VTDNav进行导航定位
4 节点遍历使用AutoPilot
5 利用XPath进行节点选择
注:
如果把VTDNav表达为车辆上导航仪器的话,那么Autoap就代表开车人,
他能更智能化的找到XPATH表达的含义
VTDGen
a、读取并且解析XML.如果XML格式错误将不能解析
b、在解析的过程中建立相应的索引
c、保存的是原始的二进制数据,没有转码
使用:
VTDGen vtdGen = new VTDGen();
vtdGen.parseFile(file, boolean NS);
VTDNav nav = vtdGen.getNav();
注:大数据量的XML使用:VTDGenHuge利用VTDGen进行当前游标位置的导航,方法有:
a、 toElement:(作用是控制游标的移动)
ROOT :将游标移动到根节点
PARENT:将游标移动到当前节点的父节点
FIRST_CHILD:将游标移动到当前节点的第一个子节点
LAST_CHILD :将游标移动到当前节点的最后一个子节点
NEXT_SIBLING:将游标移动到当前节点的下一个兄弟节点
PREV_SIBLING:将游标移动当前节点的上一个兄弟节点
b、toElementNS:带有命名空间
C、getText() 返回一个index
.toString(int index) 会将 >、<、&等转义符解析。
.toRawString(int index) 顾名思义,是“未经任何处理的字符串”。
.toNormalizedString(int index) 则会在解析特殊转义符的基础上,
将文本中的空白字符(包括空格、换行符、制表符等等)用一个空格代替,以使结果看起来更加“正常”。
主要是对当前游标的数据的一些具体处理。节点遍历使用Autopilot; 绑定相应的XPATH
使用:
1、设置XPATH
AutoPilot ap = new AutoPilot();
ap.selectXPath(“/a/b/text()”);
2、与VTDNav导航相绑定
VTDNav vn = vg.getNav();
ap.bind(vn);
3、控制游标
ap.evalXPath():游标移动到下一个xpath制定的位置
如果要回到第一个xpath的位置:ap.resetXPath();
4、XPATH 的相对遍历比绝对遍历的速度要快(可以使用XPATH 轴)
5、VTDNav 的push和pop方法来保存游标的上一个位置增量更新使用XMLModifier。
增量修改可以不用再遍历整个文档二进行值修改,这样就提高了修改的效率。
使用:
XMLModifier xm = new XMLModifier();
ap.bind(vn);绑定XPATH来指定修改位置
xm.bind(vn);绑定TVDgen
方法:
insertAttribute(” attr1=’val’ attr2=’val2’”);
remove()
insertBeforeElement(),insertAfterElement()
updateElementName()命名空间:
带有命名空间的xpath:
AutoPilot ap = new AutoPilot();
ap.declareXPathNameSpace(“ns1”,”someURL”);
ap.selectXPath(“/ns1:a/ns1:b/text()”);
VTD解析XML( VTDGen、AutoPilot )相关推荐
- vtd解析xml文件-遍历
VTD官方文档:https://vtd-xml.sourceforge.io/javadoc/ VTD官方例子:https://vtd-xml.sourceforge.io/codeSample/cs ...
- python 使用sax 解析xml 文件
这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可, SAX知识了解 SAX (simple API for XML ) 有解析器和事件处理器 解析器负责读取XML文档,并向事件处理器 ...
- c语言解析xml字符串_Python XML解析
Python XML解析 什么是XML? XML 指可扩展标记语言(eXtensible Markup Language). 你可以通过本站学习XML教程 XML 被设计用来传输和存储数据. XML是 ...
- python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch
今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...
- XML 解析XML文档 XML约束
XML 什么是XML Extensible Markup Language(可扩展的标记语言) 他是一个语言,有自己的语法,和Java以及其他的编程无关 "标记" 在文件中包含类似 ...
- VC解析XML--使用CMarkup类解析XML
经过今天尝试MFC解析XML串,也算有了不少收获,总结一下. 我是使用的CMarkup类对XML进行操作. CMarkup好象都是先从一个xml ...
- JAVA动态读取xml_Java动态生成和解析xml文件步骤详解
packageday12;importjava.io.FileInputStream;importjava.util.ArrayList;importjava.util.List;importorg. ...
- java xml中的冒号_Java jdom解析xml文件带冒号的属性
Java jdom解析xml文件带冒号的属性 如果xml文件解析带了冒号的属性,一般都是要特别处理,这里是命名空间,N年前遇到过一次忘记记录,后来也忘了,这次再记录下. 解决了,记录下,分享给大家,百 ...
- java xml dom4j 解析_在JAVA中怎么用DOM和DOM4j解析XML啊?
二.XML文件 三.开始解析 public class JDOMTest { public static void main(String[] args) { // 进行对books.xml文件的JD ...
最新文章
- C++知识:__stdcall、__cdcel和__fastcall三者的区别
- linux——管理系统设备之磁盘的加密、加密磁盘的挂载及磁盘阵列、配额
- java hprof_java 性能之 hprof
- 《数据库SQL实战》查找所有已经分配部门的员工的last_name和first_name
- C++笔记-lambda表达式需要注意的地方
- JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用[转载]
- mysql b 树 锁_mysql索引B+树、MVCC、锁一文搞懂
- 亚马逊靠“新闻稿”推动创新,跃居市值第一
- kendo实现grid的inline编辑
- 【单片机仿真】(十一)指令系统逻辑运算指令 — 逻辑与指令ANL、逻辑或指令ORL
- Tensorflow加载SavedModel模型过程源码阅读
- 周集中团队Nature子刊中网络图布局的R语言可视化复现
- HMS Core线上Codelabs挑战赛第二期开始
- 【Java实例】王者荣耀阵容展示
- 微信扫码登录自定义二维码显示信息
- IPV4服务器如何支持ipv6访问
- 装X与务实并存!iPad越狱必装插件汇总
- Keras BP神经网络运用于波士顿房价预测
- 遇到问题:(已解决)Texpad无法编译--“未找到TeX发型版 没有在您的系统中找到TeX发行版。....或安装您的TeX发行版”
- 计算机的软件教学设计七年级,计算机软件系统教学设计.doc
热门文章
- java农夫过河问题_农夫过河问题——C语言程序设计(转)
- cydia java_Cydia Substrate 使用
- Mac下载vscode 缓慢?以下解决方法起飞下载
- 从菜鸟到大师——Python量化之路
- python动态爬取知乎_Python新手爬虫:爬取搜狗图片(动态)
- porta rch_Smeerch.it
- jzoj5989. 【北大2019冬令营模拟2019.1.6】Forest (set)
- python创建网盘_超简单!基于Python搭建个人“云盘”
- 竞价推广关键词怎么选择?
- win8\win server 2012添加【中文--美式键盘】