java node.appendChild未删除上一个标记
我尝试合并两个XML文档,有两个简单的示例: 设计XML: 方法说明说,将用新的应答标签替换应答标签 Node org.w3c.dom.Node.appendChildNode newChild抛出DomeException 将节点newChild添加到此节点的子节点列表的末尾 节点。如果newChild已经在树中,则首先将其删除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并尝试添加完
有什么想法吗?选项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;
}
}
}
}