2012-05-17 118 views
0

我对使用Stax Parser进行xml读取有一个疑问。 预期结果:Java HashMap未返回预期结果

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> 

回答

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]] 
+0

亲爱user845279现在导致像 {hq_seq_mast = {},db_sequence_info = {}} – BALASCJP

+0

@BALASCJP - 我只是测试它,更换' firstXml.clear()'与'firstXml =新的LinkedHashMap ()',它会工作。 – user845279

+0

'firstXml.clear()'&'firstxml = new LinkedHashMap ();'之间的确切区别是什么?在上面我首先分配了'FirstxmlCollection.put(tableName,firstXml);'然后只清除问题如何出现,请你解释一下'firstXml.clear()' – BALASCJP