【问题标题】:How to add an xml element in Java 1.4如何在 Java 1.4 中添加 xml 元素
【发布时间】:2008-11-03 21:54:37
【问题描述】:

我正在尝试添加“标题”元素,但收到 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(未知来源) 在 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)

            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>

【问题讨论】:

    标签: java jdk1.4


    【解决方案1】:

    不确定这是否是原因,但请检查您的 DOM 实现是否验证了对 DOM 的所有更改。因为在你的代码中,

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

    将尝试创建一个文本节点作为map 元素的子节点,而 DITA Map 不允许这样做。相反,尝试

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

    【讨论】:

    • 很好的洞察力。但是我更改了代码(并更新了问题),出现了同样的问题。
    【解决方案2】:

    由于某种原因,父节点似乎是只读的。 使用以下方法克隆文档:

    Document newDoc = doc.cloneNode(true);
    

    通过以下方式将其设置为读写:

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

    然后做你的事情。 不过,我会在保存后返回新文档。

    【讨论】:

    • Node 和 Document 在 1.4 中都没有 setReadOnly 属性。你能帮我解决这个问题吗?
    【解决方案3】:

    原始文件来自哪里?

    这就是问题的原因 - 在文档中读取的代码正在构建一个只读文档。在不知道你是如何阅读它的情况下,很难弄清楚如何改变它。

    我刚刚使用 JDK 1.4.2-11 在 Windows 上进行了快速测试,我可以确认使用 DocumentBuilderFactory(XML 内容来自阅读器)不会创建只读文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2013-03-16
      相关资源
      最近更新 更多