code: private void visitAndMerge(final Document document, File targetFile) throws IOException, DocumentException {
      SAXReader reader = new SAXReader();
      reader.setValidation(false);
      org.dom4j.Document doc = reader.read(targetFile);
      final org.dom4j.Element rootElement = doc.getRootElement();
      rootElement.accept(new VisitorSupport() {
  
        @Override
        public void visit(org.dom4j.Element node) {
          //根节点的直属子节点
          if (node.getParent() == rootElement) {
            XmlElement xe = findMatchedElementIn(document, node);
            if (xe == null) { // 新增节点 添加到document中
              int index = node.getParent().elements().indexOf(node);
              xe = transformElement(node);
              log.info("XmlElement Add ---> " + xe.getName() + " id=" + idValue(node));
              document.getRootElement().getElements().add(index, xe);
            } else { // 合并已经存在的节点
              XmlElement nxe = transformElement(node);
              mergeExistedElement(nxe, xe);
              log.info("XmlElement Merge ---> " + xe.getName() + " id=" + idValue(node));
            }
          }
        }
  
        @Override
        public void visit(Comment node) {
          // mbg 暂不支持xml doc注释节点添加
        }
  
      });
    }
docs: 访问并合并mapper的xml文件
  
  @param document   generate xml dom tree
  @param targetFile the file for writing xml content
  @throws java.io.IOException
  @throws org.dom4j.DocumentException