VTD-XML是一种无提取的XML解析方法,它较好的解决了DOM占用内存过大的缺点,并且还提供了快速的解析与遍历、对XPath的支持和增量更新等特性。VTD-XML是一个开源项目,目前有Java、C两种平台支持。
由于VTD-XML选取特定节点的遍历,修改都有很好的简单实例,这里就不再举例了。
下面的实例是尝试遍历整个XML的节点,还不是很完善。
遍历XML的所有节点
public static void travelAll(VTDNav vn) throws Exception { BookMark bm = new BookMark(); vn.toElement(VTDNav.ROOT); // assume vn is already available AutoPilot ap = new AutoPilot(vn); // ap is going to move the cursor ap.selectElement("*"); // select every element (* matches all strings) while (ap.iterate()) // iterate will iterate thru all elements { // put processing logic here System.out.println("Element name ==> " + vn.toString(vn.getCurrentIndex())); int t = vn.getText(); if (t != -1) System.out.println("Text content ==> " + vn.toNormalizedString(t)); int attrIndex = vn.getAttrVal("partNum"); if (attrIndex != -1) { System.out.println("attrValue----------" + vn.toString(attrIndex)); } // make sure that the cursor position entering the loop is the same // as the position exiting the loop // One way to do is use teh combination of vn.push() and vn.pop() // The other is to manually move the cursor back into the original place } vn.toElement(VTDNav.ROOT); // reset the cursor to point to the root element }
遍历XML所有节点的属性
public static void travelAllAttribute(VTDNav vn) throws Exception { String rootName = vn.toString(vn.getRootIndex()); System.out.println(rootName); if (vn.toElement(VTDNav.ROOT)) { int r0 = vn.getCurrentIndex(); if (r0 != -1) { System.out.println("rootName---------- " + vn.toString(r0)); } AutoPilot ap = new AutoPilot(vn); ap.selectAttr("*"); int attrCount = vn.getAttrCount(); for (int i = 0; i < attrCount; i++) { int a = ap.iterateAttr(); if (a != -1) { System.out.println("attrName---------- " + vn.toString(a)); } } while (vn.toElement(VTDNav.FIRST_CHILD)) { while (vn.toElement(VTDNav.NEXT_SIBLING)) { int c = vn.getCurrentIndex(); if (c != -1) { System.out.println("first child name----------- " + vn.toString(c)); } int f = vn.getText(); if (f != -1) { System.out.println("first child value---------- " + vn.toString(f)); } ap.selectAttr("*"); attrCount = vn.getAttrCount(); for (int i = 0; i < attrCount; i++) { int attrIndex = ap.iterateAttr(); if (attrIndex != -1) { String attrName = vn.toString(attrIndex); System.out.println("attrName---------- " + attrName); int attrValueIndex = vn.getAttrVal(attrName); if (attrValueIndex != -1) { String attrValue = vn.toString(attrValueIndex); System.out.println("attrValue---------- " + attrValue); } } } } } if (vn.toElement(VTDNav.FIRST_CHILD)) { int c = vn.getCurrentIndex(); if (c != -1) { System.out.println("first child name-----------" + vn.toString(c)); } int f = vn.getText(); if (f != -1) { System.out.println("first child ------" + vn.toString(f)); } int d = vn.getCurrentDepth(); System.out.println(d); if (vn.toElement(VTDNav.FIRST_CHILD)) { int i = vn.getCurrentIndex(); } } if (vn.toElement(VTDNav.NEXT_SIBLING)) { int c = vn.getCurrentIndex(); if (c != -1) { System.out.println("first child name-----------" + vn.toString(c)); } int f = vn.getText(); if (f != -1) { System.out.println("first child ------" + vn.toString(f)); } int d = vn.getCurrentDepth(); System.out.println(d); if (vn.toElement(VTDNav.FIRST_CHILD)) { c = vn.getCurrentIndex(); if (c != -1) { System.out.println("first child name-----------" + vn.toString(c)); } f = vn.getText(); if (f != -1) { System.out.println("first child ------" + vn.toString(f)); } d = vn.getCurrentDepth(); System.out.println(d); ap.selectAttr("*"); attrCount = vn.getAttrCount(); for (int i = 0; i < attrCount; i++) { int a = ap.iterateAttr(); if (a != -1) { System.out.println("attrName---------- " + vn.toString(a)); int t = vn.getAttrVal(vn.toString(a)); System.out.println("attrValue---------- " + vn.toString(t)); } } if (vn.toElement(VTDNav.FIRST_CHILD)) { int i = vn.getCurrentIndex(); } } } } }
VTD-XML API文档 VTD-XML_intro.zip在附件中
参考:
http://blog.csdn.net/jamesmf/article/details/7769730
http://www.javaworld.com/article/2071745/soa/simplify-xml-processing-with-vtd-xml.html
http://www.codeproject.com/Articles/28237/Programming-XPath-with-VTD-XML
相关推荐
5. VTD-XML实例应用: - 数据提取:通过XPath查询,快速获取XML文档中的特定数据。 - 数据验证:利用AutoPilot验证XML文档是否符合预定义的结构。 - 数据转换:将XML文档转换为其他格式,如JSON或CSV。 - 数据...
3. **事例**:实例是学习任何技术的关键,这里包含的案例可能涵盖了一系列常见的XML处理任务,如XML数据的读取、写入、修改和验证。通过这些例子,开发者可以直观地看到如何在实际项目中应用VTD-XML。 4. **集合**...
1. 创建VTD-XML解析器实例。 2. 使用VTD-XML的`parse()`方法加载XML数据。 3. 使用`AutoPilot`或`Nav`接口导航XML结构,进行数据提取或操作。 4. 完成处理后,释放VTD-XML的资源。 对比传统的Pull解析器,如Android...
网上vtd的使用资料比较少,可能是太简单了没人想写吧。自己写的Demo,对VTDNav、AutoPilot进一步进行封装,从而简化解析代码,仅供参考 上传后才发现上传的demo.xml错了,貌似无法重新上传,内容应该是 <?xml ...
2. **解析XML文档**:使用VTDGen类解析XML文档,生成一个VTD导航器(VTDNavigator),它是VTD-XML的核心组件,可以高效地遍历和访问XML文档。 3. **定位XML元素**:通过VTDNavigator的API,如`selectElement()`和`...
VTD,全称为Variable Tree Decomposition,是一种高效的数据解析技术,尤其在XML处理领域中广泛应用。这个压缩包包含了丰富的VTD开发资源,包括中英文的PPT教程、vtd.jar库以及开发示例,旨在帮助开发者更好地理解和...
Java没有内置的PULL解析器,但可以使用如Android的XmlPullParser或VTD-XML库实现。 4. JAXB(Java Architecture for XML Binding):用于XML与Java对象之间的自动转换,简化了XML数据的序列化和反序列化过程。通过...