Java HashMap未返回预期结果

时间:2012-05-17 19:08:33

标签: java hashmap linkedhashmap

我对使用Stax Parser进行xml读取有一个疑问。 预期成果:

  

hq_seq_mast {SEQ_VAL = SEQ_VAL,1 =列,LAST_SEQ_VAL = LAST_SEQ_VAL,2 =列}   db_sequence_info {TNAME = TNAME,3 =列,CNAME = CNAME,4 =列}

实际结果:

  

{hq_seq_mast = {},db_sequence_info = {}}

我做了什么错误。

import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.LinkedHashMap;

public class SaxDiffChecker {
public static LinkedHashMap<String,LinkedHashMap<String,String>>FirstxmlCollection=new LinkedHashMap<String,LinkedHashMap<String,String>>();
public static LinkedHashMap<String,String> firstXml=new LinkedHashMap<String,String>();

public static String tableName=null;
public static String tableendElement=null;
public static String columendElement=null;
public static String characterElement=null;
public static String tempendElement=null;
public static String tempName=null;
public static String ntempName=null;
public static int key=0;

public void print(String fileLocation) {
    try {

        FileInputStream fileInputStream = new FileInputStream(fileLocation);
        XMLStreamReader xmlStreamReader =    XMLInputFactory.newInstance().createXMLStreamReader(fileInputStream);
        while (xmlStreamReader.hasNext()) {
            printEventInfo(xmlStreamReader);
           }
        System.out.print("======="+FirstxmlCollection);
        xmlStreamReader.close();
    } catch (XMLStreamException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    } catch (FileNotFoundException e) {
        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
    }
}


 private static void printEventInfo(XMLStreamReader reader) throws XMLStreamException {

    int eventCode = reader.next();


    switch (eventCode) {


        case 1 :

            //System.out.println("event = START_ELEMENT");
            //System.out.println("Localname = "+reader.getLocalName()+" Attribute Name"+reader.getAttributeValue(0));

            if("table".equalsIgnoreCase(reader.getLocalName())){

                tableName=reader.getAttributeValue(null,"name");
                tableendElement=reader.getLocalName();
            }else if("column".equalsIgnoreCase(reader.getLocalName())){
                columendElement=reader.getLocalName();
                firstXml.put(reader.getAttributeValue(0),reader.getAttributeValue(0));
            }else{
                tempendElement=reader.getLocalName();
            }
            break;
        case 2 :

            //System.out.println("event = END_ELEMENT");
            //System.out.println(tableendElement+"Localname = "+reader.getLocalName());
            if(tableendElement.length()>0 && tableendElement!=null && tableendElement.equalsIgnoreCase(reader.getLocalName())){
                System.out.println(tableName+"Heeee"+firstXml);
               FirstxmlCollection.put(tableName,firstXml);
               firstXml.clear();


            }else if(columendElement.length()>0 && columendElement!=null && columendElement.equalsIgnoreCase(reader.getLocalName())){
                firstXml.put(""+key++,columendElement);
            }
            break;
        case 3 :

            //System.out.println("event = PROCESSING_INSTRUCTION");
            //System.out.println("PIData = " + reader.getPIData());
            break;
        case 4 :

            //System.out.println("event = CHARACTERS");characterElement

            //System.out.println("Characters = " + reader.getText());
            break;
        case 5 :

            //System.out.println("event = COMMENT");
            //System.out.println("Comment = " + reader.getText());
            break;
        case 6 :

            System.out.println("event = SPACE");
            System.out.println("Space = " + reader.getText());
            break;
        case 7 :

            System.out.println("event = START_DOCUMENT");
            System.out.println("Document Started.");
            break;
        case 8 :

            //System.out.println("event = END_DOCUMENT");
            System.out.println("Document Ended");
            break;
        case 9 :

            //System.out.println("event = ENTITY_REFERENCE");
            //System.out.println("Text = " + reader.getText());
            break;
        case 11 :

            //System.out.println("event = DTD");
            //System.out.println("DTD = " + reader.getText());

            break;
        case 12 :

            //System.out.println("event = CDATA");
            //System.out.println("CDATA = " + reader.getText());
            break;
    }
}

public static void main(String[] args) {
    SaxDiffChecker eventsPrinter = new SaxDiffChecker();
    eventsPrinter.print("C:\\Users\\vellikutti\\Desktop\\bala.xml");


 }

}

xml:
<data-dictionary name="hq">
 <table engine-type="InnoDB" name="hq_seq_mast" scope="HQ">
 <columns>
  <column name="SEQ_VAL">
  <data-type>int(10)</data-type> 
  <nullable>false</nullable> 
 </column>
 <column name="LAST_SEQ_VAL">
   <data-type>int(10)</data-type> 
   <nullable>false</nullable> 
  </column>
 </columns>
 </table>
 <table engine-type="InnoDB" name="db_sequence_info" scope="HQ">
 <columns>
 <column name="TNAME">
 <data-type>varchar(30)</data-type> 
 <nullable>false</nullable> 
 </column>
 <column name="CNAME">
 <data-type>varchar(30)</data-type> 
 <nullable>false</nullable> 
  </column>
  </columns>
  </table>

1 个答案:

答案 0 :(得分:2)

以下是您的问题firstXml.clear()。数据正在被清除。您可能希望将firstXml设为局部变量或将其设置为firstXml = new LinkedHashMap<String,String>();,而不是清除它。

代码更改:

//create new map instead of clearing saved map (remember - obj passed by ref)
firstXml=new LinkedHashMap<String,String>();//firstXml.Clear();

结果:

hq_seq_mastHeeee [SEQ_VAL:SEQ_VAL, 0:column, LAST_SEQ_VAL:LAST_SEQ_VAL, 1:column]
db_sequence_infoHeeee [TNAME:TNAME, 2:column, CNAME:CNAME, 3:column]
Document Ended
=======[hq_seq_mast:[SEQ_VAL:SEQ_VAL, 0:column, LAST_SEQ_VAL:LAST_SEQ_VAL, 1:column], db_sequence_info:[TNAME:TNAME, 2:column, CNAME:CNAME, 3:column]]