2013-05-04 46 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

相关问题