3

「タイトル」要素を追加しようとしていますが、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 myProject.Main.main(Main.java:48) の myProject.Main.saveDoc(Main.java:171) の .apache.xerces.internal.dom.NodeImpl.appendChild(不明なソース)

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

3 に答える 3

2

それが理由かどうかはわかりませんが、DOM 実装が DOM へのすべての変更を検証するかどうかを確認してください。あなたのコードでは、

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

エレメントの子としてテキスト ノードを作成しようとしますがmap、DITA マップはそれを許可しません。代わりに、試してください

Element title = doc.createElement("title");
title.appendChild(doc.createTextNode("title content"))
nextNode.appendChild(title);
于 2008-11-04T11:12:27.683 に答える
0

何らかの理由で、親ノードが読み取り専用のようです。以下を使用してドキュメントを複製します。

Document newDoc = doc.cloneNode(true);

次の方法で読み書き可能に設定します。

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

それからあなたのことをしてください。ただし、保存後に新しいドキュメントを返します。

于 2008-11-03T22:13:19.237 に答える
0

元のドキュメントはどこから来たのですか?

これが問題の原因です。ドキュメントを読み込んでいるコードが読み取り専用ドキュメントを作成しています。どのように読み込んでいるのかを知らずに、それを変更する方法を見つけるのはかなり困難です.

JDK 1.4.2-11 を使用して Windows で簡単なテストを行ったところ、DocumentBuilderFactory (リーダーからの XML コンテンツを使用) を使用しても読み取り専用のドキュメントが作成されないことが確認できました。

于 2008-11-04T04:43:48.823 に答える