Question

J'essaie d'ajouter un " titre " élément mais j'obtiens une erreur 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 ligne ci-dessus est en train de générer une erreur: Exception dans le fil "Main". org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR : Une tentative de modification d'un objet pour laquelle les modifications ne sont pas autorisées est effectuée.     sur com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore (Source inconnue)     sur com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore (Source inconnue)     à l'adresse com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild (Source inconnue)     à myProject.Main.saveDoc (Main.java:171)     à myProject.Main.main (Main.java:48)                       pause;

              }



              nextNode = nextNode.getNextSibling();



          }
}

Mon fichier xml ressemble à ceci:

<?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>
Était-ce utile?

La solution

Vous n'êtes pas sûr que ce soit la raison, mais vérifiez si votre implémentation DOM valide toutes les modifications apportées au DOM. Parce que dans votre code,

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

tentera de créer un nœud de texte en tant qu'enfant de l'élément map et DITA Map ne le permet pas. Au lieu de cela, essayez

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

Autres conseils

Pour une raison quelconque, le nœud parent semble être en lecture seule. Cloner le document en utilisant:

Document newDoc = doc.cloneNode(true);

Configurez-le en lecture-écriture par:

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

Ensuite, faites vos affaires. Je retournerais le nouveau document après l'avoir sauvegardé.

D'où provient le document original?

C'est la cause du problème: le code lu dans le document construit un document en lecture seule. Sans savoir comment vous le lisez, il est assez difficile de trouver un moyen de changer cela.

Je viens de faire un test rapide sous Windows avec JDK 1.4.2-11 et je peux confirmer que l'utilisation de DocumentBuilderFactory (avec le contenu XML provenant d'un Reader) ne crée pas un document en lecture seule.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top