2012-12-15 250 views
0

我想將XML數據插入MySQL數據庫。我編寫的SAX解析器在測試時自行工作。但是,每當我嘗試將記錄插入到數據庫中時,即使我確保將值分配給爲空的工作流元素,我也會得到NullPointerException。這是我的數據庫表代碼。 包數據庫;插入XML數據到MySQL數據庫

//STEP 1. Import required packages 
import java.sql.*; 
import java.io.*; 
import org.w3c.dom.*; 
import javax.xml.parsers.*; 

public class Table { 
// JDBC driver name and database URL 
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
static final String DB_URL = "jdbc:mysql://baldwin.isri.cmu.edu/SciSIP"; 

// Database credentials 
static final String USER = "user"; 
static final String PASS = "pass"; 

public Table() { 

} 

public void createTable() {  
    Connection con = null; 
    Statement stmt = null; 
    try{ 
     //STEP 2: Register JDBC driver 
     Class.forName("com.mysql.jdbc.Driver"); 

     //STEP 3: Open a connection 
     System.out.println("Connecting to a selected database..."); 
     con = DriverManager.getConnection(DB_URL, USER, PASS); 
     System.out.println("Connected database successfully..."); 

     //STEP 4: Execute a query 
     System.out.println("Creating table in given database..."); 
     stmt = con.createStatement(); 

     String sql = "CREATE TABLE IF NOT EXISTS workflow" + 
       "(id INTEGER not NULL AUTO_INCREMENT, " + 
       " annotationBean VARCHAR(255), " + 
       " date VARCHAR(255), " + 
       " text VARCHAR(255), " + 
       " identification VARCHAR(255), " + 
       " PRIMARY KEY (id))"; 

     stmt.executeUpdate(sql); 
     System.out.println("Created table in given database..."); 
    } catch(SQLException se) { 
     //Handle errors for JDBC 
     se.printStackTrace(); 
    } catch(Exception e) { 
     //Handle errors for Class.forName 
     e.printStackTrace(); 
    } finally { 
     //finally block used to close resources 
     try { 
      if(stmt != null) 
       con.close(); 
     } catch(SQLException se) { 
     }// do nothing 
     try { 
      if(con != null) 
       con.close(); 
     } catch(SQLException se) { 
      se.printStackTrace(); 
     }//end finally try 
    }//end try 
    System.out.println("Goodbye!"); 
} 

public void insertRecord(String annotationBean, String date, String text, String identification) { 
    Connection con = null; 
    Statement stmt = null; 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); //Load the driver   
     con = DriverManager.getConnection(DB_URL, USER, PASS); 
     stmt = con.createStatement(); 
     String sql = "INSERT INTO `workflow` VALUES ('"+annotationBean+"', '"+date+"', '"+text+"', '"+identification+"')"; 
     stmt.execute(sql); //Insert a row 
     System.out.println("Record Inserted into Database..."); 
    } catch(SQLException se) { 
     //Handle errors for JDBC 
     se.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     //finally block used to close resources 
     try { 
      if(stmt != null) 
       con.close(); 
     } catch(SQLException se) { 
     }// do nothing 
     try { 
      if(con != null) 
       con.close(); 
     } catch(SQLException se) { 
      se.printStackTrace(); 
     }//end finally try 
    }//end try 
} 

這裏是我的解析器代碼與插入記錄語句。

package parser; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
import database.Table; 

public class XML_Parser_SAX extends DefaultHandler{ 
List aWorkflow; 
private String tempVal; 
//to maintain context 
private Workflow tempWorkflow; 

public XML_Parser_SAX(){ 
    aWorkflow = new ArrayList(); 
} 

public void runExample() { 
    parseDocument(); 
    printData(); 
} 

private void parseDocument() { 
    //get a factory 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    try { 

     //get a new instance of parser 
     SAXParser sp = spf.newSAXParser(); 

     //parse the file and also register this class for call backs 
     sp.parse("workflow.xml", this); 

    }catch(SAXException se) { 
     se.printStackTrace(); 
    }catch(ParserConfigurationException pce) { 
     pce.printStackTrace(); 
    }catch (IOException ie) { 
     ie.printStackTrace(); 
    } 
} 

/** 
* Iterate through the list and print 
* the contents 
*/ 
private void printData(){ 

    System.out.println("Number of Tasks in Workflow: '" + aWorkflow.size() + "'."); 

    Iterator it = aWorkflow.iterator(); 
    while(it.hasNext()) { 
     System.out.println(it.next().toString()); 
    } 
} 


//Event Handlers 
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
    //reset 
    tempVal = ""; 
    if(qName.equalsIgnoreCase("annotationBean")) { 
     //create a new instance of employee 
     tempWorkflow = new Workflow(); 
     tempWorkflow.setAnnotationBean(attributes.getValue("class")); 
     System.out.println("class"); 
    } 
} 


public void characters(char[] ch, int start, int length) throws SAXException { 
    tempVal = new String(ch,start,length); 
} 

public void endElement(String uri, String localName, String qName) throws SAXException { 

    if(qName.equalsIgnoreCase("annotationBean")) { 
     //add it to the list 
     aWorkflow.add(tempWorkflow); 
     System.out.println("annotationBean"); 

    } else if (qName.equalsIgnoreCase("date")) { 
     if (tempVal != null) { 
      tempWorkflow.setDate(tempVal); 
     } 
     else { 
      tempWorkflow.setDate("null"); 
     } 
     System.out.println(tempWorkflow.getDate()); 
    } else if (qName.equalsIgnoreCase("text")) { 
     if (tempVal != null) { 
      tempWorkflow.setText(tempVal); 
     } 
     else { 
      tempWorkflow.setText("null"); 
     } 
     System.out.println(tempWorkflow.getText()); 
    } else if (qName.equalsIgnoreCase("identification")) { 
     if (tempVal != null) { 
      tempWorkflow.setIdentification(tempVal); 
     } 
     else { 
      tempWorkflow.setIdentification("null"); 
     } 
     System.out.println(tempWorkflow.getIdentification()); 
    } 
    Table t = new Table(); 
    //t.createTable(); 
    t.insertRecord(tempWorkflow.getAnnotationBean(), tempWorkflow.getDate(), tempWorkflow.getText(), tempWorkflow.getIdentification()); 
} 

public static void main(String[] args){ 
    XML_Parser_SAX parse = new XML_Parser_SAX(); 
    parse.runExample(); 
} 

} 

有人能告訴我這是爲什麼給我NullPointerException異常?提前致謝!!!

這裏是堆棧跟蹤:

Exception in thread "main" java.lang.NullPointerException 
at parser.XML_Parser_SAX.endElement(XML_Parser_SAX.java:126) 
at  com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:606) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1741) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2898) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302) 
at javax.xml.parsers.SAXParser.parse(SAXParser.java:274) 
at parser.XML_Parser_SAX.parseDocument(XML_Parser_SAX.java:49) 
at parser.XML_Parser_SAX.runExample(XML_Parser_SAX.java:35) 
at parser.XML_Parser_SAX.main(XML_Parser_SAX.java:131) 

是,workflow.xml存在。下面是它的一個副本。

<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-  2.4.0"><dataflow id="8781d5f4-d0ba-48a8-a1d1-14281bd8a917" role="top"><name>Hello_World</name>  <inputPorts /><outputPorts><port><name>greeting</name><annotations /></port></outputPorts>  <processors><processor><name>hello</name><inputPorts /><outputPorts><port><name>value</name>  <depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations />  <activities><activity><raven><group>net.sf.taverna.t2.activities</group>  <artifact>stringconstant-activity</artifact><version>1.4</version></raven>  <class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /> <outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"> <net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns=""> 
    <value>Hello, World!</value> 
</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean> <annotations /></activity></activities><dispatchStack><dispatchLayer><raven>  <group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact>  <version>1.4</version></raven>  <class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class>  <configBean encoding="xstream">  <net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns=""> 
    <maxJobs>1</maxJobs> 
    </net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig> </configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group> <artifact>workflowmodel-impl</artifact><version>1.4</version></raven> <class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class> <configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer> <raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact> <version>1.4</version></raven> <class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean  encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven> <group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact> <version>1.4</version></raven> <class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean  encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig  xmlns=""> 
    <backoffFactor>1.0</backoffFactor> 
    <initialDelay>1000</initialDelay> 
    <maxDelay>5000</maxDelay> 
    <maxRetries>0</maxRetries> 
</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean> </dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group>  <artifact>workflowmodel-impl</artifact><version>1.4</version></raven>  <class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean   encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack>  <iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack>   </processor></processors><conditions /><datalinks><datalink><sink type="dataflow">  <port>greeting</port></sink><source type="processor"><processor>hello</processor>  <port>value</port></source></datalink></datalinks><annotations><annotation_chain   encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns=""> 
    <annotationAssertions> 
    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 
     <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.Author"> 
     <text>Stian Soiland-Reyes</text> 
     </annotationBean> 
     <date>2012-01-03 15:10:48.73 GMT</date> 
     <creators /> 
     <curationEventList /> 
    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 
    </annotationAssertions> 
</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain  encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns=""> 
    <annotationAssertions> 
    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 
     <annotationBean  class="net.sf.taverna.t2.annotation.annotationbeans.DescriptiveTitle"> 
     <text>Hello World</text> 
     </annotationBean> 
      <date>2012-01-03 15:10:54.167 GMT</date> 
     <creators /> 
    <curationEventList /> 
    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 
    </annotationAssertions> 
    </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain>   <annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl  xmlns=""> 
    <annotationAssertions> 
    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 
     <annotationBean  class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion"> 
     <identification>8781d5f4-d0ba-48a8-a1d1-14281bd8a917</identification> 
     </annotationBean> 
     <date>2012-01-03 15:12:21.684 GMT</date> 
    <creators /> 
    <curationEventList /> 
</net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 

<text>One of the simplest workflows possible. No workflow input ports, a   single   workflow output port "greeting", outputting "Hello, world!" as produced by the  String   Constant "hello".</text> 
       </annotationBean> 
      <date>2012-01-03 15:12:15.643 GMT</date> 
      <creators /> 
      <curationEventList /> 
     </net.sf.taverna.t2.annotation.AnnotationAssertionImpl> 
     </annotationAssertions> 
     </net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations >   
</dataflow></workflow> 
+0

您可以請發佈stacktrace嗎? –

+0

這是stacktrace: – amber4478

+0

workflow.xml存在嗎? – vels4j

回答

0

tempWorkflow設置爲null。

startElement只有在獲得annotationBean startTag時纔會生成tempWorkflow,但它會在任何結束標記上執行失敗的元素。所以當它得到</configBean>它會失敗。

您需要有相應的開始和結束行動=您必須添加更多的開始行動。而且你還必須檢查一切是否在正確的位置正確初始化。

這將有很大的幫助,如果你把日誌語句(如log4j的),如:

LOG.debug("start-tag tempWorkFlow"); 

這將使你制定出準確的代碼時被調用。

+0

我只想要4個元素annotationBean,日期,文本和標識。我想從XML文件轉儲所有其他數據,所以我如何設置它,只保存數據庫中的這些元素?我會嘗試添加log4j語句,看看是否有幫助。 – amber4478

+0

即使它是無操作的(然後您可以記錄它),也可能是一個好主意來捕獲您感興趣的每個元素的開始和結束。您正在爲每個end元素創建一個表。我猜想這隻應該在startDocument中出現。當你結束元素net.sf.taverna.t2.annotation.AnnotationChainImpl時,你可能需要添加記錄。你需要處理你的邏輯 - 如果你仔細的工作,它會很好 –