2011-04-30 69 views
2

您好,我在嘗試將 新節點添加到xml文件時允許不允許修改,我不確定爲什麼,因爲我使用的是相同的代碼另一個文件,它工作正常,這裏是代碼:NO_MODIFICATION_ALLOWED_ERR:試圖修改不允許修改的對象

public void addStockItem(String itemStr, int qty){ 
    String path = System.getProperty("user.dir") + "/src/stock.xml"; 
     try { 
    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     docFactory.setIgnoringElementContentWhitespace(true); 

     DocumentBuilder docBuilder;  

     docBuilder = docFactory.newDocumentBuilder(); 

     Document doc = docBuilder.parse(path); 

     Node root = doc.getFirstChild(); 

     Node item = doc.createElement("item"); 
     item.setTextContent(itemStr); 
     NamedNodeMap itemAttr = item.getAttributes(); 
     Attr qtyAttr = doc.createAttribute("quantity"); 
     qtyAttr.setTextContent(qty+""); 
     itemAttr.setNamedItem(qtyAttr); 
     root.appendChild(item); 

     Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

     //initialize StreamResult with File object to save to file 
     StreamResult result = new StreamResult(new StringWriter()); 
     DOMSource source = new DOMSource(doc); 
     transformer.transform(source, result); 
     String xmlString = result.getWriter().toString(); 

     BufferedWriter out = new BufferedWriter(new FileWriter(path)); 
     out.write(xmlString); 
     out.close(); 

    } catch (Exception ex) { 
     System.out.print(ex); 

    } 

} 

我的XML如下:

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE stock SYSTEM "barstock.dtd"> 

<stock> 
    <item quantity="23">dark rum</item> 
    <item quantity="5">light rum</item> 
    <item quantity="4">vodka</item> 
    <item quantity="2">brandy</item> 
    <item quantity="3">orange juice</item> 
    <item quantity="2">cream</item> 
    <item quantity="2">dry vermouth</item> 
    <item quantity="7">amaretto</item> 
</stock> 

有了這個DTD:

<!-- DTD for bar stock (drink ingredients --> 
<!-- One day we should add a way to allow quantities and units to be included --> 

    <!ELEMENT stock (item)*> 

    <!ELEMENT item (#PCDATA)> 
    <!ATTLIST item quantity CDATA #IMPLIED> 

感謝您的幫助。


編輯:我(阿米爾Rachum)我將我自己的堆棧跟蹤的問題,因爲我有這個問題還有:

org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR: An attempt is made to modify an object where modifications are not allowed. 
    at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(Unknown Source) 
    at com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(Unknown Source) 
    at cs236369.hw5.servlets.xml.UploadTheme.addThemeToList(UploadTheme.java:115) 
    at cs236369.hw5.servlets.xml.UploadTheme.doPost(UploadTheme.java:91) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Unknown Source) 
+0

你可以添加堆棧跟蹤嗎?我假設錯誤發生在'root.appendChild(item)'上,但我想確定:) – Augusto 2011-04-30 09:02:03

+0

是的,當我得到堆棧跟蹤錯誤時:運行: org.w3c.dom.DOMException:NO_MODIFICATION_ALLOWED_ERR:嘗試修改不允許修改的對象[Ljava.lang.StackTraceElement; @ 4406cef4 – JustMe 2011-05-01 06:19:18

+0

我也一直有這個問題。任何解決方案 – 2011-08-06 14:45:21

回答

3

@Amir Rachum,@JustMe:

例外含義:NO_MODIFICATION_ALLOWED_ERR:如果此節點只讀,則引發

在上面的代碼中,您依靠doc.getFirstChild();來提供你根元素。從不這樣做,因爲按照DOM模型,文檔的子項是Comment,Processing Instruction,根元素。所以你永遠不知道你的DOM解析器實現可能會給你處理指令或評論。對它調用appendChild()方法之前

Element rootelment=document.getDocumentElement(); 
//code to create a new node 
rootlement.appendChild(newnode); 

如果你仍然不能確定我們的代碼,只是打印getNodeType(),然後看DOM specification它是否爲只讀節點或不 - :改用以下。

+0

作品像一個魅力,謝謝! – 2011-08-07 17:04:29