Domanda

Sto cercando di aggiungere un " titolo " ma sto ricevendo un errore NO_MODIFICATION_ALLOWED_ERR ...

 private static void saveDoc(String f) throws Exception
    {

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
                    Document doc = db.parse(f);

              // create DOMSource for source XML document
              DOMSource xmlSource = new DOMSource(doc);


              Node nextNode = xmlSource.getNode().getFirstChild();

              while (nextNode != null)
          {
              System.out.print("\n node name: " + nextNode.getNodeName() + "\n");
              if (nextNode.getNodeName().equals("map")){
                  nextNode.appendChild(doc.createElement("title")); 

la riga sopra sta generando un errore: Eccezione nella discussione "principale" org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR : viene effettuato un tentativo di modificare un oggetto in cui non sono consentite modifiche.     su com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore (fonte sconosciuta)     su com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore (fonte sconosciuta)     su com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild (fonte sconosciuta)     su myProject.Main.saveDoc (Main.java:171)     su myProject.Main.main (Main.java:48)                       break;

              }



              nextNode = nextNode.getNextSibling();



          }
}

Il mio file xml è simile al seguente:

<?xml version="1.0" encoding="UTF-8"?>
<?dctm xml_app="LOPackage"?>
<!DOCTYPE map PUBLIC "-//OASIS//DTD DITA Map//EN" "file:C:/Documents%20and%20Settings/joe/Desktop//LOPackage/map.dtd">
<map xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" class="- map/map " ditaarch:DITAArchVersion="1.1" domains="(map mapgroup-d) (topic indexing-d)">
    <topicref class="- map/topicref " href="dctm://ai/0501869e80002504?DMS_OBJECT_SPEC=RELATION_ID" type="Le"/>
    <topicref class="- map/topicref " href="dctm://ai/0501869e80002505?DMS_OBJECT_SPEC=RELATION_ID" type="Pr"/>
    <topicref class="- map/topicref " href="dctm://ai/0501869e80002506?DMS_OBJECT_SPEC=RELATION_ID" type="Pr"/>
</map>
È stato utile?

Soluzione

Non sono sicuro se questo sia il motivo, ma controlla se l'implementazione del DOM convalida tutte le modifiche al DOM. Perché nel tuo codice,

nextNode.appendChild(doc.createTextNode("title"));

tenterà di creare un nodo di testo come figlio dell'elemento map e DITA Map non lo consente. Invece, prova

Element title = doc.createElement("title");
title.appendChild(doc.createTextNode("title content"))
nextNode.appendChild(title);

Altri suggerimenti

Per qualche ragione, il nodo padre sembra essere di sola lettura. Clonare il documento utilizzando:

Document newDoc = doc.cloneNode(true);

Impostalo su read-write di:

newDoc.setReadOnly(false,true);
//                       ^^^^ also sets children

Quindi fai le tue cose. Vorrei restituire il nuovo documento dopo averlo salvato.

Da dove proviene il documento originale?

Questa è la causa del problema: il codice che sta leggendo nel documento sta costruendo un documento di sola lettura. Senza sapere come lo stai leggendo, è abbastanza difficile capire come cambiarlo.

Ho appena eseguito un test rapido su Windows con JDK 1.4.2-11 e posso confermare che l'utilizzo di DocumentBuilderFactory (con il contenuto XML proveniente da un Reader) non crea un documento di sola lettura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top