2008-11-03 8 views
3

Je suis en train d'ajouter un élément « titre » mais je reçois une erreur de NO_MODIFICATION_ALLOWED_ERR ...Comment ajouter un élément XML en Java 1.4

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 de lancer erreur: Exception en fil "main" org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR: Une tentative est faite pour modifier un objet où les modifications ne sont pas autorisées. at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore (source inconnue) at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore (source inconnue) at com. sun.org.apache.xerces.internal.dom.NodeImpl.appendChild (source inconnue) à myProject.Main.saveDoc (Main.java:171) à myProject.Main.main (Main.java:48) break;

   } 



       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> 

Répondre

2

Vous ne savez pas si c'est 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")); 

tente de créer un nœud de texte que l'enfant de map élément et DITA carte ne permet pas. Au lieu de cela, essayez

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

Bonne idée. Mais j'ai changé le code (et mis à jour la question), le même problème se produit. – joe

0

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

Document newDoc = doc.cloneNode(true); 

Set à lecture-écriture par:

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

Alors faites vos affaires. Je retournerais le nouveau document après l'avoir enregistré.

+0

ni Node ni Document a une propriété setReadOnly dans 1.4. Peux-tu m'aider avec ça? – joe

0

D'où vient le document original?

C'est la cause du problème - le code qui lit dans le document construit un document en lecture seule. Sans savoir comment vous le lisez, il est assez difficile de déterminer comment changer cela.

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

+0

J'ai mis à jour le code afin de montrer d'où je l'obtiens. – joe

+0

** mise à jour de l'exemple de code pour afficher – joe

Questions connexes