使用 SAX 解析器遍历 xml 文档并以所需格式打印输出

traversing xml document using SAX parser and printing output in desired format

我正在尝试解析附加的 xml(请查找附件)文件。 xml 文件如给定 below.check 附件 1 和 2

sample data of xml file

为了解析这个 xml,我使用了 SAX 解析器。程序如下

package com.dom;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

public class DemoXML {
    File file;
    SAXParserFactory factory;
    SAXParser saxParser;
    UserHandler handler;

    public void loadXML()
    {
        file = new File("E:/fifthWorkbenchProjects/XMLUtility/src/input/FIXBOND.xml");
        System.out.println(file.exists());
    }
    public void readXML()
    {
        factory = SAXParserFactory.newInstance();

            try {
                saxParser = factory.newSAXParser();
                handler = new UserHandler();
                try {
                    saxParser.parse(file,handler);
                } catch (IOException e) {

                    e.printStackTrace();
                }


            } catch (ParserConfigurationException e) {

                e.printStackTrace();
            } catch (SAXException e) {

                e.printStackTrace();
            }


    }
public static void main(String args[])
{
    DemoXML ob = new DemoXML();
    ob.loadXML();
    ob.readXML();
}
}

 class UserHandler extends DefaultHandler
{
     Hashtable tags;
     @Override
    public void startDocument()
    {
        System.out.println("Document started");
        tags = new Hashtable();
    }
     @Override
     public void endDocument()
     {
         System.out.println("Documents ended"); 
     }

     @Override
     public void startElement(String namespaceURI,String localName,String qname,Attributes atts) throws SAXException
     {
        // System.out.println("Element started");
        // if(qname.equals("Currency"))
        System.out.print(qname+"-->");

     }

     @Override
     public void endElement(String uri,String localName, String qname)
     {

     }
     @Override
     public void characters(char[] ch, int start, int length)
     {
         String str =  new String(ch,start,length);
         System.out.println(str);
         System.out.println();
     }

}

我按以下方式获得输出。 真的 文档开始 FIgovcorpagncy-->InstrumentDescription-->InstrumentType-->FI GOVCORPAGNCY

InstrumentSubType-->FIXDBOND

仪器名称-->QUEENSNR 0% 07/06/2016

仪器描述-->QUEENSNR 0% 07/06/2016

货币-->GBP

仪器状态-->活跃

未付金额-->48384375

AmtOutstandingDate-->2012-06-27T00:00:00.000

PrincipalExchange-->N

CountryOfRisk-->GB

仪器完整性-->50

CapitalRanking-->1

发行时-->发行日期-->2012-06-27T00:00:00.000

原始发行量-->48384375

PrivatePlacementFlag-->Y

最小面额-->1000

最小增量-->0.01

等等....我能够访问所有节点但是在这里观察到树中第一个元素的一件事,完整的元素地址打印如下 FIgovcorpagncy-->InstrumentDescription-->InstrumentType-->FI GOVCORPAGNCY

然后对于树中的其余元素,它打印标签名称和相应的值,如 InstrumentSubType-->FIXDBOND

仪器名称-->QUEENSNR 0% 07/06/2016

仪器描述-->QUEENSNR 0% 07/06/2016

货币-->GBP

仪器状态-->活跃

未付金额-->48384375

等等....

这里我的要求是我也想以完全分层的方式打印这些元素作为第一个元素。

怎么办?

class UserHandler 扩展了 DefaultHandler { 列表 li_elements,li_values;

 LinkedHashMap<List<String>,List<String>> hm; 
 boolean endElementFlag;

 @Override
public void startDocument()
{
    System.out.println("Document started");
    li_elements = new ArrayList<String>();
    li_values=new ArrayList<String>();
}
 @Override
 public void endDocument()
 {
     System.out.println("Documents ended"+hm.size()); 
     for(Map.Entry m:hm.entrySet())
     {
         System.out.println(m.getKey()+""+m.getValue());
     }

 }

 @Override
 public void startElement(String namespaceURI,String localName,String qname,Attributes atts) throws SAXException
 {

    li_elements.add(qname);

    //System.out.println("Element Started");
    //System.out.println(qname+" added in element list");   
 }
 @Override
 public void endElement(String uri,String localName, String qname)
 {

     if(!li_values.isEmpty())
     {
     System.out.println("Element address list:-"+li_elements+"and Corresponding Value:-"+li_values);

     System.out.println();
     }

         li_elements.remove(li_elements.size()-1);
         li_values.clear();

 }
 @Override
 public void characters(char[] ch, int start, int length)
 {

    String str =  new String(ch,start,length);
    li_values.add(str);
 }  

}

我期待这样的事情。这会以我希望的格式打印输出。