vtd解析xml文件-遍历

本文介绍VTD-XML解析器的功能与使用方法,包括支持的编码类型及如何进行文件解析。通过实例演示了如何利用VTD-XML进行XML文件的编码转换和解析,展示了遍历XML元素和获取文本内容的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }

声明:代码整合来自于本人同事之手!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值