1. 程式人生 > >SAX解析XML檔案-遍歷

SAX解析XML檔案-遍歷

    @Test
    public void saxXml()
    {
        long startTime = System.currentTimeMillis();
        try
        {
            // step 1: 獲得SAX解析器工廠例項
            SAXParserFactory factory = SAXParserFactory.newInstance();
            // step 2: 獲得SAX解析器例項
            SAXParser parser = factory.newSAXParser();
            // step 3: 開始進行解析
            // 傳入待解析的文件的處理器
            parser.parse(new File("E:\\a\\2018111412301.xml"), new MyHandler());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("執行時間:" + (endTime - startTime) + "ms");
    }

    class MyHandler extends DefaultHandler
    {
        private int count = 0;

        private String value;

        /**
         * @param uri        xml文件的名稱空間
         * @param localName  標籤的名字
         * @param qName      帶名稱空間的標籤的名字
         * @param attributes 標籤的屬性集
         * @Description:標籤(節點)解析開始時呼叫
         * @Date: 2018/12/13 13:08
         * @Method startElement
         * @Return void
         */
        @Override
        public void startElement(String uri,
            String localName, String qName, Attributes attributes)
        {
            //遍歷整個xml檔案
            System.out.println("<" + qName);
            int len = attributes.getLength();
            for (int i = 0; i < len; i++)
            {
                System.out.println(attributes.getQName(i) + "=" + attributes.getValue(i));//得到節點的屬性資訊
            }
            System.out.println(">");

         /* 得到當前節點下的value值
            if ("cimNARI:SubControlArea.recordApp".equals(qName))
            {
                System.out.println("<" + qName);
                int len = attributes.getLength();
                for (int i = 0; i < len; i++)
                {
                    System.out.println(attributes.getQName(i) + "=" + attributes.getValue(i));//得到節點的屬性資訊
                }
                System.out.println(">");
            }*/


            //得到當前節點的屬性資訊 節點資訊:<cim:Substation rdf:ID="210000138">
          /*
            System.out.println("<" + qName);
           //當前節點 :cim:Substation
          if ("cim:Substation".equals(qName))
            {
                System.out.println("<" + qName);
                int len = attributes.getLength();
                for (int i = 0; i < len; i++)
                {
                    //當前節點屬性的值:210000138
                    if ("210000138".equals(attributes.getValue(i)))
                    {
                        name = qName;
                        System.out.println(attributes.getQName(i) + "=" + attributes.getValue(i));//得到節點的屬性資訊
                    }
                }
                System.out.println(">");
            }*/
        }

        /**
         * @param ch     當前讀取到的TextNode(文字節點)的位元組陣列
         * @param start  位元組開始的位置,為0則讀取全部
         * @param length 當前TextNode的長度
         * @Author:SunHongchen
         * @Description:解析標籤的內容的時候呼叫
         * @Date: 2018/12/13 13:10
         * @Method characters
         * @Return void
         */
        @Override
        public void characters(char ch[], int start, int length)
        {
            String str = new String(ch, start, length);// 將當前TextNode轉換為String
            if (!"\n".equals(str))
            {
                //value = str;
                System.out.print(str);//"當前節點中的值===>" +
            }
        }

        @Override
        public void endElement(String uri,
            String localName, String qName)
        {
            //得到當前節點下的value值
           /*
            if ("cimNARI:SubControlArea.recordApp".equals(qName))
            {
                System.out.println(value);
                count++;
                System.out.println(count);
            }*/
            //遍歷整個xml檔案
            System.out.println("</" + qName + ">");
        }

    }