Frage

Ich versuche, ein „Titel“ Element hinzufügen, aber eine NO_MODIFICATION_ALLOWED_ERR Störung erhalten ...

 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")); 

die Zeile über Fehler wirft: Ausnahme im Thread „main“ org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR: Es wird versucht, ein Objekt in der Änderung erlaubt ist nicht zu ändern.     bei com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore (Unknown Source)     bei com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore (Unknown Source)     bei com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild (Unknown Source)     bei myProject.Main.saveDoc (Main.java:171)     bei myProject.Main.main (Main.java:48)                       brechen;

              }



              nextNode = nextNode.getNextSibling();



          }
}

Meine XML-Datei sieht wie folgt aus:

<?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>
War es hilfreich?

Lösung

Nicht sicher, ob das der Grund ist, aber überprüfen, ob Ihre DOM-Implementierung alle Änderungen an den DOM validiert. Da in Sie Code,

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

wird versuchen, einen Textknoten als Kind map Element zu erstellen und DITA Map nicht, dass erlauben. Stattdessen versuchen

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

Andere Tipps

Aus irgendeinem Grund scheint der übergeordnete Knoten schreibgeschützt zu werden. Klonen Sie das Dokument mit:

Document newDoc = doc.cloneNode(true);

es auf schreibSchreib von:

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

Sie dann Ihre Sachen. Ich würde das neue Dokument zurückzukehren, nachdem es allerdings zu speichern.

Wo wird das Originaldokument aus Richtung?

Das ist die Ursache des Problems - der Code, der in dem Dokument liest ist ein schreibgeschützte Dokument zu konstruieren. Ohne zu wissen, wie Sie es in lesen, ist es ziemlich schwierig, herauszufinden, wie das zu ändern.

Ich habe gerade einen schnellen Test auf Windows mit JDK 1.4.2-11, und ich kann bestätigen, dass die Verwendung von Document (mit den XML-Inhalten aus einem Reader kommen) nicht über ein Nur-Lese-Dokument erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top