كيفية إضافة عنصر XML في Java 1.4
سؤال
أحاول إضافة عنصر "العنوان" ولكني أتلقى الخطأ 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"));
السطر أعلاه يرمي الخطأ: استثناء في سلسلة الرسائل "الرئيسية" org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR
:جرت محاولة لتعديل كائن حيث لا يُسمح بإجراء تعديلات.في com.sun.org.apache.xerces.internal.dom.parentnode.internalinsertbefore (مصدر غير معروف) في com.sun.org.apache.xerces.internal.dom.parentnode.insertbefore (غير معروف) في com.sun.org .apache.xerces.internal.dom.nodeimpl.appendchild (مصدر غير معروف) في myproject.main.savedoc (main.java:171) في myproject.main.main (main.java:48)
}
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>
المحلول
لست متأكدًا مما إذا كان هذا هو السبب، ولكن تحقق مما إذا كان تنفيذ DOM الخاص بك يتحقق من صحة جميع التغييرات التي تم إجراؤها على DOM.لأنه في رمزك،
nextNode.appendChild(doc.createTextNode("title"));
سيحاول إنشاء عقدة نصية باعتبارها تابعة لـ map
العنصر وخريطة DITA لا تسمح بذلك.بدلا من ذلك، حاول
Element title = doc.createElement("title");
title.appendChild(doc.createTextNode("title content"))
nextNode.appendChild(title);
نصائح أخرى
لسبب ما، يبدو أن العقدة الأصلية للقراءة فقط.استنساخ المستند باستخدام:
Document newDoc = doc.cloneNode(true);
اضبطه على القراءة والكتابة عن طريق:
newDoc.setReadOnly(false,true);
// ^^^^ also sets children
ثم افعل أشياءك.سأعيد المستند الجديد بعد حفظه.
من أين تأتي الوثيقة الأصلية؟
هذا هو سبب المشكلة - الكود الذي تتم قراءته في المستند يقوم بإنشاء مستند للقراءة فقط.دون أن تعرف كيف تقرأه، من الصعب جدًا معرفة كيفية تغيير ذلك.
لقد أجريت للتو اختبارًا سريعًا على Windows باستخدام JDK 1.4.2-11، ويمكنني أن أؤكد أن استخدام DocumentBuilderFactory (مع محتوى XML القادم من القارئ) لا يؤدي إلى إنشاء مستند للقراءة فقط.