Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java node.appendChild未删除上一个标记_Java_Xml_Dom - Fatal编程技术网

java node.appendChild未删除上一个标记

java node.appendChild未删除上一个标记,java,xml,dom,Java,Xml,Dom,我尝试合并两个XML文档,有两个简单的示例: 设计XML: 方法说明说,将用新的应答标签替换应答标签 Node org.w3c.dom.Node.appendChildNode newChild抛出DomeException 将节点newChild添加到此节点的子节点列表的末尾 节点。如果newChild已经在树中,则首先将其删除 有什么想法吗?选项1:newChild不会被删除,因为每次追加时都会创建一个新的节点对象,即方法createTextNode。如果您添加了newChild并尝试添加完

我尝试合并两个XML文档,有两个简单的示例:

设计XML:

方法说明说,将用新的应答标签替换应答标签

Node org.w3c.dom.Node.appendChildNode newChild抛出DomeException

将节点newChild添加到此节点的子节点列表的末尾 节点。如果newChild已经在树中,则首先将其删除


有什么想法吗?

选项1:newChild不会被删除,因为每次追加时都会创建一个新的节点对象,即方法createTextNode。如果您添加了newChild并尝试添加完全相同的对象,那么旧对象将被删除。找到保存应答文本节点引用的方法

选项2:当您找到匹配的ID时,检查应答节点是否已经存在,如果已经存在,则更新它,而不是附加新的应答节点。这样,您就不必保存来自先前创建的应答节点的引用

示例代码未经测试,它只是一个帮助您前进的想法:

//I suggest to use constants
private static final String ANSWER_NODE_NAME = "answer";

// Adding the anwser to the original document
NodeList answerNodeList = documentAnswer.getElementsByTagName("*");
for (int m = 1; m < answerNodeList.getLength(); m++) {
    Node answerNode = answerNodeList.item(m);
    if (answerNode.getNodeType() == Node.ELEMENT_NODE) {
        if (child.equals(answerNode.getNodeName())) {


            //Check if answer node already exists
            //if it does, update its content instead of appending a new answer node
            NodeList children = node.getChildNodes();

            boolean answerNodeExists = false;
            for(int j = 1; j < children.getLength(); j++){
                Node origDocumentChild = children.item(j);

                //check if node is <answer>
                if (origDocumentChild.getNodeName().equals(ANSWER_NODE_NAME)) {

                    //set new answer content
                    origDocumentChild.setTextContent("new answer 123");
                    answerNodeExists = true;
                    break;
                }
            }

            if (!answerNodeExists) {
                Element answer = document.createElement("answer");
                answer.appendChild(document.createTextNode(answerNode.getTextContent()));
                node.appendChild(answer);
                break;
            }               
        }
    }
}

文本节点不会按其内容进行比较。不会删除newChild,因为每次追加时都会创建一个新的节点对象,即方法createTextNode。如果您添加了newChild并尝试添加完全相同的对象,那么旧对象将被删除。找到一种保存应答文本节点引用的方法,或者直接通过DOM进行更新。@CrazySabPath好的,我可以尝试类似于您建议的方法,但是没有其他方法可以以干净的方式完成,而不必事先获取节点?
<form>
    <id1>answer1</id1>
</form>
<element type="INPUT-TEXT">
    <id>id1</id>
    <name>Id1</name>
    <order>1</order>
    <required>false</required>
    <answer>answer1</answer>
</element>
<element type="INPUT-TEXT">
    <id>id1</id>
    <name>Id1</name>
    <order>1</order>
    <required>false</required>
    <answer>answer1</answer>
    <answer>newAnswer1</answer>
</element>
public String createEditableXML(String xml) {

        try {
            Document document;
            Document documentAnswer;

            document = _loadXMLFromString(xml);
            documentAnswer = _loadXMLFromString(vars);

            String child = null;

            // Design xml part
            NodeList nodeList1 = document.getChildNodes();
            NodeList nodeList = nodeList1.item(0).getChildNodes();
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE && node.getNodeName().equals("element")) {

                    // Taking id to compare with the answer XML
                    NodeList childNode = node.getChildNodes();
                    for (int n = 0; n < childNode.getLength(); n++) {
                        if (childNode.item(n).getNodeName().equals("id")) {
                            child = childNode.item(n).getTextContent();
                            break;
                        }
                    }

                    // Adding the anwser to the original document
                    NodeList answerNodeList = documentAnswer.getElementsByTagName("*");
                    for (int m = 1; m < answerNodeList.getLength(); m++) {
                        Node answerNode = answerNodeList.item(m);
                        if (answerNode.getNodeType() == Node.ELEMENT_NODE) {
                            if (child.equals(answerNode.getNodeName())) {
                                Element answer = document.createElement("answer");
                                answer.appendChild(document.createTextNode(answerNode.getTextContent()));
                                node.appendChild(answer);
                                break;
                            }
                        }
                    }
                }
            }

            return _nodeListToString(nodeList1);

        } catch (Exception e) {
            String mess = "createEditableXML(): " + (e.getMessage() != null ? ". " + e.getMessage() : "")
                    + (e.getCause() != null ? ". " + e.getCause() : "");
            logger.error(mess);
        }
        return null;

    }
//I suggest to use constants
private static final String ANSWER_NODE_NAME = "answer";

// Adding the anwser to the original document
NodeList answerNodeList = documentAnswer.getElementsByTagName("*");
for (int m = 1; m < answerNodeList.getLength(); m++) {
    Node answerNode = answerNodeList.item(m);
    if (answerNode.getNodeType() == Node.ELEMENT_NODE) {
        if (child.equals(answerNode.getNodeName())) {


            //Check if answer node already exists
            //if it does, update its content instead of appending a new answer node
            NodeList children = node.getChildNodes();

            boolean answerNodeExists = false;
            for(int j = 1; j < children.getLength(); j++){
                Node origDocumentChild = children.item(j);

                //check if node is <answer>
                if (origDocumentChild.getNodeName().equals(ANSWER_NODE_NAME)) {

                    //set new answer content
                    origDocumentChild.setTextContent("new answer 123");
                    answerNodeExists = true;
                    break;
                }
            }

            if (!answerNodeExists) {
                Element answer = document.createElement("answer");
                answer.appendChild(document.createTextNode(answerNode.getTextContent()));
                node.appendChild(answer);
                break;
            }               
        }
    }
}