Java: изменение существующего XML создать дополнительный конечный узел при синтаксическом анализе - PullRequest
0 голосов
/ 03 августа 2020

При создании нового узла и добавлении в существующий XML -документ с использованием приведенного ниже фрагмента кода

выражение XPath, например «rootNode / parentNode1 / 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>

1 Ответ

0 голосов
/ 03 августа 2020

Повторяющиеся конечные теги вставляются из-за создания дочернего узла без проверки того, существует этот узел или нет.

  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);
  }
...