2008-11-03 3 views
3

Я пытаюсь добавить элемент «название», но я получаю сообщение об ошибке NO_MODIFICATION_ALLOWED_ERR ...Как добавить элемент XML в 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")); 

выше линии метания ошибки: исключение в потоке «main» org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR: предпринимается попытка изменить объект, если модификации не разрешены. at com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore (Неизвестный источник) at com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore (Неизвестный источник) at com. sun.org.apache.xerces.internal.dom.NodeImpl.appendChild (Неизвестный источник) на myProject.Main.saveDoc (Main.java:171) на myProject.Main.main (Main.java:48) break;

   } 



       nextNode = nextNode.getNextSibling(); 



      } 
} 

Мой файл XML выглядит следующим образом:

<?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> 

ответ

2

Не знаете, если это причина, но проверьте, подтверждает ли ваша реализация DOM все изменения в DOM. Потому что в вас код,

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

будет пытаться создать текстовый узел в качестве дочернего элемента map и Дита Карта не позволит. Вместо этого попробуйте

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

По какой-то причине, родительский узел, кажется, только для чтения. Клонировать документ с помощью:

Document newDoc = doc.cloneNode(true); 

Установите его для чтения-записи с помощью:

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

Затем сделайте свой материал. Я бы вернул новый документ после его сохранения.

+0

ни Узел, ни документ не имеют свойства setReadOnly в 1.4. Не могли бы вы мне помочь? – joe 2008-11-03 22:26:47

0

Откуда взялся исходный документ?

В этом причина проблемы - код, который читается в документе, создает документ только для чтения. Не зная, как вы его читаете, довольно сложно разобраться, как это изменить.

Я только что проверил быструю проверку Windows с помощью JDK 1.4.2-11, и могу подтвердить, что использование DocumentBuilderFactory (с содержимым XML, поступающего из Reader) не создает документ только для чтения.

+0

Я обновил код, чтобы показать, откуда я его получаю. – joe 2008-11-05 16:27:39

+0

** обновленный образец кода, чтобы показать – joe 2008-11-05 17:23:16

Смежные вопросы