0

Stax Parser を使用した xml の読み取りに関して 1 つ疑問があります。期待される結果:

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>

4

1 に答える 1

2

これがあなたの問題firstXml.clear()です。データを消去しています。firstXml = new LinkedHashMap<String,String>();クリアする代わりに、firstXml をローカル変数にするか、に設定することをお勧めします。

コードの変更:

//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]]
于 2012-05-17T19:33:55.650 に答える