0

次の関数を使用して、タグとその値を動的にxmlファイルに追加しようとしています.first -nameという名前のタグとその値をルートタグの下に追加しようとしています。しかし、次のスニペットの実行中に例外が発生します。

    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 を強調表示しました。

4

2 に答える 2

1

document要素は、設定する必要のあるルート要素です。27行目を次のように変更します

document.appendChild(blobKey_E);
于 2012-08-27T19:12:51.203 に答える
1

document.getDocumentElement()この場合は戻りますnull

Javadoc forgetDocumentElement()は、機能について次のように述べています。

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

あなたの場合、root elementあなたのDOMには添付されていません。ルート要素として DOMdocument.appendChild(blobKey_E);にアタッチする必要がある場合があります。blobKey_E

理想的には、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();
    }
}
于 2012-08-27T19:05:00.423 に答える