VTD官方文档:https://vtd-xml.sourceforge.io/javadoc/
VTD官方例子:https://vtd-xml.sourceforge.io/codeSample/cs1.html
* VTD-XML支持哪些编码类型?
从版本2.6开始,VTD-XML支持ASCII,UTF-8,UTF-8859-1至UTF-8859-16,WIN1250至WIN1258,UTF-16LE和UTF-16BE。
@Test
public void vtdXmlTest()
{
long currentTime = System.currentTimeMillis();
long time1 = 0L;
try
{
String filePath = "E:\\a\\201811141230.xml";
//编码转换,因为VTD不支持GBK
convertFile.convertFile(filePath, "GBK", "UTF-8");
time1 = System.currentTimeMillis() - currentTime;
VTDGen vg = new VTDGen();
boolean flag = vg.parseFile(filePath, true);
VTDNav vn = vg.getNav();
foreach3(vn);
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println("转换编码用时===========:" + time1);
System.out.println("共用时===========:" + (System.currentTimeMillis() - currentTime));
}
private static void foreach3(VTDNav vn)
throws NavException
{
printVN(vn, "");
if (vn.toElement(VTDNav.FIRST_CHILD))
{
foreach3(vn);
}
else
{
printVNTxt(vn);
}
while (vn.toElement(VTDNav.NEXT_SIBLING))
{
//foreach3(vn);
printVN(vn, "");
if (vn.toElement(VTDNav.FIRST_CHILD))
{
foreach3(vn);
}
else
{
printVNTxt(vn);
}
}
vn.toElement(VTDNav.PARENT);
return;
}
private static void foreach1(VTDNav vn)
throws NavException
{
//指向根节点
vn.toElement(VTDNav.ROOT);
printVN(vn, "+");
//指向一级节点
if (vn.toElement(VTDNav.FIRST_CHILD))
{
printVN(vn, "+++");
//指向二级节点
findSec(vn);
while (vn.toElement(VTDNav.NEXT_SIBLING))
{
printVN(vn, "+++");
//指向二级节点
findSec(vn);
}
}
}
private static void findSec(VTDNav vn)
throws NavException
{
if (vn.toElement(VTDNav.FIRST_CHILD))
{
//存在二级节点并打印
printVN(vn, "+++++");
printVNTxt(vn);
//打印所有的二级节点
while (vn.toElement(VTDNav.NEXT_SIBLING))
{
printVN(vn, "+++++");
printVNTxt(vn);
}
vn.toElement(VTDNav.PARENT);
}
else
{
printVNTxt(vn);
}
}
private static void printVN(VTDNav vn, String pre)
throws NavException
{
System.out.println("\n" + pre + "节点名:" + vn.toString(vn.getCurrentIndex()));
findAttr(vn);
}
private static void printVNTxt(VTDNav vn)
throws NavException
{
int t = vn.getText();
if (t != -1)
{
System.out.print(" 节点值:" + vn.toString(t));
}
}
private static void findAttr(VTDNav vn)
throws NavException
{
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)
{
String attrName = vn.toString(a);
int attrValueIndex = vn.getAttrVal(attrName);
if (attrValueIndex != -1)
{
String attrValue = vn.toString(attrValueIndex);
System.out.print(" 节点属性值:" + attrName + " : " + attrValue + ";");
}
}
}
return;
}
声明:代码整合来自于本人同事之手!