Pregunta

Estoy intentando agregar un " título " elemento pero obtengo un error 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 línea de arriba arroja un error: Excepción en el hilo " main " org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR : se intenta modificar un objeto donde no se permiten modificaciones.     en com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore (Fuente desconocida)     en com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore (fuente desconocida)     en com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild (Fuente desconocida)     en myProject.Main.saveDoc (Main.java:171)     en myProject.Main.main (Main.java:48)                       romper;

              }



              nextNode = nextNode.getNextSibling();



          }
}

Mi archivo xml se ve así:

<?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>
¿Fue útil?

Solución

No estoy seguro de si esa es la razón, pero verifique si su implementación de DOM valida todos los cambios en el DOM. Porque en tu código,

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

intentará crear un nodo de texto como hijo del elemento map y DITA Map no lo permite. En su lugar, intente

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

Otros consejos

Por alguna razón, el nodo padre parece ser de solo lectura. Clone el documento usando:

Document newDoc = doc.cloneNode(true);

Configúrelo para lectura-escritura por:

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

Entonces haz tus cosas. Sin embargo, devolvería el nuevo documento después de guardarlo.

¿De dónde viene el documento original?

Esa es la causa del problema: el código que se lee en el documento está construyendo un documento de solo lectura. Sin saber cómo lo estás leyendo, es bastante difícil averiguar cómo cambiar eso.

Acabo de hacer una prueba rápida en Windows con JDK 1.4.2-11, y puedo confirmar que el uso de DocumentBuilderFactory (con el contenido XML procedente de un lector) no crea un documento de solo lectura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top