質問
" title"を追加しようとしています。要素ですが、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"));
上記の行はエラーをスローしています:スレッド" main"の例外org.w3c.dom.DOMException: NO_MODIFICATION_ALLOWED_ERR
:変更が許可されていないオブジェクトを変更しようとしました。
com.sun.org.apache.xerces.internal.dom.ParentNode.internalInsertBefore(Unknown Source)で
com.sun.org.apache.xerces.internal.dom.ParentNode.insertBefore(Unknown Source)で
com.sun.org.apache.xerces.internal.dom.NodeImpl.appendChild(Unknown Source)で
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 Mapはそれを許可しません。代わりに、試してください
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を使用して簡単なテストを行ったところ、DocumentReaderFactory(リーダーからのXMLコンテンツを使用)を使用しても読み取り専用のドキュメントが作成されないことを確認できます。