我对使用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>
答案 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]]