2013-05-04 47 views
1

基本上我有一個看起來有點像這樣的XMLFILE:在Java中使用SAX事件處理程序,如何在不同事件中保存變量?

<?xml version="1.0" encoding="UTF-8"?> 
<DATABASE> 
<TABLE> 
    <TABLENAME>emp</TABLENAME> 
    <FIELDNAME type="boolean">a</FIELDNAME> 
    <FIELDNAME type="char(3)">b</FIELDNAME> 
    <FIELDNAME type="date">c</FIELDNAME> 
    <FIELDNAME type="integer">d</FIELDNAME> 
    <FIELDNAME type="real">e</FIELDNAME> 
    <FIELDNAME type="varchar">f</FIELDNAME> 

</TABLE> 

這是我的SAX讀取代碼:

public class SAXReader { 
public SAXReader() throws SAXException, IOException { 
    XMLReader reader = XMLReaderFactory.createXMLReader(); 
    reader.setContentHandler(new ContentHandler()); 
    reader.parse("database.xml"); 
} 

private class ContentHandler extends DefaultHandler { 
    private boolean table = false; 
    private boolean tableName = false; 
    private boolean fieldName = false; 
    private String fieldType; 
    private String tableNameString = ""; 
    private String fieldList = ""; 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     if (qName.equalsIgnoreCase("tablename")) { 
      tableName = true; 

     } 
     if (qName.equalsIgnoreCase("fieldname")) { 
      fieldName = true; 
      fieldType = attributes.getValue("type"); 
     } 
     if (qName.equalsIgnoreCase("table")) { 
      table = true; 
     } 
    } 

    /* 
    * This fires whenever the XMLReader encounters a </> 
    */ 
    @Override 
    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
     if (tableName) { 
      tableName = false; 
     } 
     if (fieldName) { 
      fieldName = false; 
     } 
     if (table) {     
      table = false; 
     } 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     String data = new String(ch, start, length); 
     // test against stored values 
     if (tableName) { 
      tableNameString = data; 
     } 
     if (fieldName) { 
      fieldList += (data+ " " + fieldType + ", "); 
     } 
     if (table){ 
      try { 
       Database.database.addTable(tableNameString, fieldList); 
      } catch (MyException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
} 

我的問題。在方法字符中,在(fieldName)if塊期間,我tableNameString的值仍然存在。在(table)if塊期間,tableNameString的值仍然存在,但我在(fieldName)塊中創建的字符串會丟失其值。我已經打印出了我在(fieldName)塊中構建的字符串,並且它構建了我需要的字符串,但只要我在(表格)塊中消失,但是tableNameString的值不會。爲什麼?

編輯:嗯,我明白了爲什麼。字符方法被稱爲<>和之間的空格。所以當然這個字段列表還沒有建立。那麼將它放在endElement方法的工作?如果不是,爲什麼?

回答

1

試圖改變這部分

@Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     if (qName.equalsIgnoreCase("tablename")) { 
      tableName = false; 
     } else if (qName.equalsIgnoreCase("fieldname")) { 
      fieldName = false; 
     } else if (qName.equalsIgnoreCase("table")) { 
      try { 
       Database.database.addTable(tableNameString, fieldList); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      fieldList = ""; 
     } 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     String data = new String(ch, start, length); 
     if (tableName) { 
      tableNameString = data; 
     } else if (fieldName) { 
      fieldList += (data + " " + fieldType + ", "); 
     } 
    } 

BTW equalsIgnoreCase在XML處理是一個壞主意,XML名稱是區分大小寫因此「表名」和「TABLENAME」 2個不同的標籤。它更好地使用

qName.equals("TABLENAME")) 
+0

在文檔的末尾這樣做的問題是,理論上我會有多個表。儘管如此,我仍會記住.equals。 – ladyoftime315 2013-05-04 04:05:28

+0

我看到了,更新了多個表的代碼 – 2013-05-04 04:20:53

+0

我實際上已經在大約20分鐘前結束了。所以我至少很高興我弄明白了。結束了一個新的非常無關的問題,涉及字符串在我的addTable函數中很難解析。我可以解決這個問題。謝謝您的幫助! – ladyoftime315 2013-05-04 04:40:08

相關問題