docs: private StringBuffer buildXMLNodeByString(NodeConfig config, int deep) {
  		StringBuffer xmlBuffer = new StringBuffer();
  		String tagName = config.getName();
  
  		if (isLowCase == true) {
  			tagName = StringUtils.lowerCase(config.getName());
  		}
  
  		List<Namespace> namespaces = config.getNamespace();
  		if (namespaces != null && namespaces.size() > 0) {
  			Namespace namespace = namespaces.get(0);
  			if (!namespace.getPrefix().equals("")) {
  				tagName = namespace.getPrefix() + ":" + tagName;
  			}
  		}
  
  		Object tagValue = config.getValue();
  		if (tagValue == null) {
  			tagValue = "";
  		}
  		if (tagValue instanceof CdataText) {
  			tagValue = String.format("<![CDATA[%s]]>", ((CdataText) tagValue).getData());
  		} else if (tagValue instanceof XmlText) {
  			tagValue = ((XmlText) tagValue).getXml();
  		} else if (cdata == true) {
  			if (XmlElementUtils.containXMLEscapeChar(tagValue.toString())) {
  				tagValue = String.format("<![CDATA[%s]]>", tagValue.toString());
  			}
  		}
  		
  		StringBuffer attributeBuffer = new StringBuffer();
  		StringBuffer nodeBuffer = new StringBuffer();
  
  		List<AttributeConfig> attributeList = config.getAttribute();
  		if (attributeList != null && attributeList.size() > 0) {
  			for (AttributeConfig attribute : attributeList) {
  				if (attribute.getValue() != null) {
  					if (nodeMode == false) {
  						if (isLowCase == true) {
  							attributeBuffer.append(String.format("%s=\"%s\" ", StringUtils.lowerCase(attribute.getName()), attribute.getValue()));
  						} else {
  							attributeBuffer.append(String.format("%s=\"%s\" ", attribute.getName(), attribute.getValue()));
  						}
  					} else {
  						NodeConfig node = new NodeConfig();
  						node.setName(attribute.getName());
  						node.setValue(attribute.getValue());
  						nodeBuffer.append(buildXMLNodeByString(node, deep + 1));
  					}
  				}
  			}
  		}
  
  		boolean isDeep = true;
  
  		List<NodeConfig> childrenNodeList = config.getChildrenNodes();
  		if (childrenNodeList != null && childrenNodeList.size() > 0) {
  			for (NodeConfig childNode : childrenNodeList) {
  				StringBuffer nodeXML = null;
  				if (childNode.getName().equals(tagName)) {
  					nodeXML = buildXMLNodeByString(childNode, deep);
  					isDeep = false;
  				} else {
  					nodeXML = buildXMLNodeByString(childNode, deep + 1);
  				}
  				nodeBuffer.append(nodeXML);
  			}
  		}
  
  		if (isDeep == false) {
  			return nodeBuffer;
  		}
  
  		String tab = "";
  		if (prettyPrint) {
  			for (int i = 0; i < deep; i++) {
  				tab += indent;
  			}
  		}
  		if (!tagName.equals(Constant.XML_TAG)) {
  			if (deep == 0) {
  				xmlBuffer.append(tab + "<" + tagName + super.namespaces);
  			} else {
  				xmlBuffer.append(tab + "<" + tagName);
  			}
  		}
  
  		if (attributeBuffer != null && attributeBuffer.length() > 0) {
  			xmlBuffer.append(" " + attributeBuffer.toString().trim());
  		}
  
  		if (!tagName.equals(Constant.XML_TAG)) {
  			if (nodeBuffer.length() > 0) {
  				xmlBuffer.append(">");
  			} else {
  				if (tagValue != null) {
  					xmlBuffer.append(">");
  				} else {
  					xmlBuffer.append("/>" + endOfLine);
  				}
  			}
  		}
  
  		if (nodeBuffer.length() > 0) {
  			xmlBuffer.append(endOfLine + nodeBuffer);
  			xmlBuffer.append(tab + "</" + tagName + ">" + endOfLine);
  		} else {
  			if (tagValue != null) {
  				if (!tagName.equals(Constant.XML_TAG)) {
  					xmlBuffer.append(tagValue.toString());
  					xmlBuffer.append("</" + tagName + ">" + endOfLine);
  				} else {
  					xmlBuffer.append(tab + tagValue + endOfLine);
  				}
  			}
  		}
  
  		return xmlBuffer;
  	}