2012-08-27 56 views
0

我試圖通過以下函數將標記和它的值動態添加到xml文件中。我試圖添加名爲的標記並且它根標籤下的值。但是在運行以下代碼段時,我收到了異常。將節點添加到根節點時發生java.lang.NullPointerException

public void write(String name) { 
    try { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder();    
     Document document = db.newDocument(); 

     Element blobKey_E = document.createElement("first-name"); 
     blobKey_E.appendChild(document.createTextNode(name)); 
     // The following line produces an exception 
     // LINE 27 
     document.getDocumentElement().appendChild(blobKey_E); // append the new tag under the root 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer(); 
     DOMSource source = new DOMSource(document); 
     StreamResult result = new StreamResult(new File("/home/non-admin/NetBeansProjects/Personal Site_Testers/web/xml/xml_1.xml")); 
     transformer.transform(source, result);    
    }catch(Exception exc) { 
     exc.printStackTrace(); 
    } 
} 

例外:

java.lang.NullPointerException 
at Beans.XmlBuilder.write(XmlBuilder.java:27) 
at Servlets.tester.doGet(tester.java:26) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
at java.lang.Thread.run(Thread.java:722) 

我已經在功能強調上面的行號27。

+0

那麼,您的代碼的哪一行是第27行?你把它放在一個調試器中並環顧四周? – bmargulies

+0

空指針異常似乎表明'document'或'document.getDocumentElement()'爲空。 –

+0

@bmargulies編輯了問題 –

回答

1

document.getDocumentElement()在這種情況下返回null

JavadocgetDocumentElement()說,下面的是功能:

This is a convenience attribute that allows direct access to the child node that is the root element of the document. 

在你的情況,不存在rootelement連接到你的DOM。您可能需要執行document.appendChild(blobKey_E);以將blobKey_E作爲根元素附加到DOM。

理想的情況下,當你試圖建立一個XML DOM,我這裏還有你需要遵循的基本步驟:

創建文檔
創建根元素,並將其添加到文檔
創建子元素並將其連接到根目錄或其他現有的子節點

public void write(String name) { 
    try { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder();    
     Document document = db.newDocument(); 

     Element blobKey_E = document.createElement("first-name"); 
     blobKey_E.appendChild(document.createTextNode(name)); 

     /* 
     * Here blobKey_E is treated as the root element for the document that you've created 
     */ 
     document.appendChild(blobKey_E); 
//   // LINE 27 
//   document.getDocumentElement().appendChild(blobKey_E); // append the new tag under the root 

     /* 
     * Post this point, if you do a document.getDocumentElement(), it will no longer return 
     * a nullpointerexception because blobKey_E will be treated as the root element. 
     */ 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer(); 
     DOMSource source = new DOMSource(document); 
     StreamResult result = new StreamResult(new File("/home/non-admin/NetBeansProjects/Personal Site_Testers/web/xml/xml_1.xml")); 
     transformer.transform(source, result);    
    }catch(Exception exc) { 
     exc.printStackTrace(); 
    } 
} 
+0

是什麼原因? –

+0

@ Y.E.P:我已經更新了答案:) – Sujay

+1

@ Y.E.P:errm,您的代碼永遠不會顯示您創建根節點的位置,並附加到您創建的「文檔」。那部分在哪裏? – Sujay

1

文檔元素是根元素,你需要設置。將第27行更改爲

document.appendChild(blobKey_E);