Java:修改现有的XML会在解析时创建额外的结束节点



创建新节点并使用以下代码片段附加到现有XML文档时

表达式是类似XPath的"XPath";rootNode/pparentNode1/parentNode2/childNode";

private static Node createParentNode(Document xmlDocument, String expression, String parentRootXPath)
throws XPathExpressionException {
final String childXPath = (expression.replace(parentRootXPath, "")).replaceFirst("/", "");
final StringBuilder parentPathBuilder = new StringBuilder(parentRootXPath);
Arrays.stream(childXPath.split("/")).forEach(childNodeName -> {
try {
Node parentNode = getNode(xmlDocument, parentPathBuilder.toString());
Node childNode = xmlDocument.createElement(childNodeName);
parentPathBuilder.append("/").append(childNodeName);
parentNode.appendChild(childNode);
} catch (XPathExpressionException e) {
LOGGER.error("Unable to create Node {}", parentPathBuilder.toString());
}
});
return getNode(xmlDocument, expression);
}
private static Node getNode(Document xmlDocument, String expression) throws XPathExpressionException {
return (Node) X_PATH.compile(expression).evaluate(xmlDocument, XPathConstants.NODE);
}

我可以附加节点,但在解析额外的末端节点时,标签正在生成

<DOCUMENT_SETS>
<DOCUMENT_SPECIFIC_DATA_SET>
<node1>value1</node1>
<new_Node1>value1</new_Node1>
<new_Node2>value1</new_Node2>
</DOCUMENT_SPECIFIC_DATA_SET>
</DOCUMENT_SETS>
<DOCUMENT_SPECIFIC_DATA_SET /> 
<DOCUMENT_SPECIFIC_DATA_SET />

输入

<DOCUMENT_SETS>
<DOCUMENT_SPECIFIC_DATA_SET>
<node1>value1</node1>
</DOCUMENT_SPECIFIC_DATA_SET>
</DOCUMENT_SETS>

预期输出

<DOCUMENT_SETS>
<DOCUMENT_SPECIFIC_DATA_SET>
<node1>value1</node1>
<new_Node1>value1</new_Node1>
<new_Node2>value1</new_Node2>
</DOCUMENT_SPECIFIC_DATA_SET>
</DOCUMENT_SETS>

由于在不检查节点是否已存在的情况下创建子节点,因此会插入重复的结束标记。

private static Node createParentNode(Document xmlDocument, String expression, String parentRootXPath)
throws XPathExpressionException {
final String childXPath = (expression.replace(parentRootXPath, "")).replaceFirst("/", "");
final StringBuilder parentPathBuilder = new StringBuilder(parentRootXPath);
Arrays.stream(childXPath.split("/")).forEach(childNodeName -> {
try {
Node parentNode = getNode(xmlDocument, parentPathBuilder.toString());
parentPathBuilder.append("/").append(childNodeName);
Node childNode = getNode(xmlDocument, parentPathBuilder.toString());
if(Objects.nonNull(childNode)){
childNode = xmlDocument.createElement(childNodeName);
parentNode.appendChild(childNode);
}
} catch (XPathExpressionException e) {
LOGGER.error("Unable to create Node {}", parentPathBuilder.toString());
}
});
return getNode(xmlDocument, expression);
}

最新更新