package xmlparser;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author Pritom K Mondal
* @created 28th August 2014
*/
public class XmlBuilder {
private Map dataMap;
private String xmlString = "";
private static final String NEW_LINE = "\n";
private static final String MATCHER_REPLACE = "[^0-9a-zA-Z:\\.]+";
private static final String MATCHER_1 = "[a-zA-Z:\\_](.*)";
public static void main(String[] args) {
Map dataMap = new HashMap();
for(int index = 1; index <= 2; index ++) {
HashMap tempMap = new HashMap();
tempMap.put("id", index);
tempMap.put("name", "Name: " + index);
tempMap.put("roll", "Roll: " + index);
HashMap attMap = new HashMap();
attMap.put("id", index * 10);
attMap.put("attr-name", "Name == " + (index * 20));
tempMap.put("<<attributes>>", attMap);
dataMap.put("user" + index, tempMap);
}
List dataList = new ArrayList();
for (int index = 0; index < 2; index++) {
HashMap tempMap = new HashMap();
tempMap.put("id", index);
tempMap.put("name", "Name: " + index);
tempMap.put("roll", "Roll: " + index);
dataList.add(tempMap);
}
dataMap.put("listMap", dataList);
HashMap resultMap = new HashMap();
resultMap.put("success", true);
resultMap.put("message", "Thank you for generating this XML.");
resultMap.put("dataMap", dataMap);
resultMap.put("dataList", dataList);
Map finalMap = new HashMap();
finalMap.put("rootTag", resultMap);
String xmlString = new XmlBuilder(finalMap).toXML();
System.out.println(xmlString);
}
XmlBuilder(Map dataMap) {
this.dataMap = dataMap;
}
public String toXML() {
/*System.out.println(this.dataMap);*/
this.renderMapAsXml(this.dataMap, "data", 0);
/*System.out.println(this.xmlString);*/
return this.xmlString;
}
private void renderListAsXml(List dataList, String wrapper, int cycle) {
wrapper = wrapper.trim();
if (!wrapper.matches(MATCHER_1)) {
wrapper = "obj_" + wrapper;
}
for (int index = 0; index < dataList.size(); index++) {
Object dataMapValue = dataList.get(index);
if (dataMapValue instanceof List) {
this.xmlString += this.makeTabSpace(cycle - 1) + "<" + wrapper + '>' + NEW_LINE;
this.renderListAsXml((List) dataMapValue, wrapper, cycle + 1);
this.xmlString += this.makeTabSpace(cycle - 1) + "</" + wrapper + '>' + NEW_LINE;
}
else if (dataMapValue instanceof Map || dataMapValue instanceof HashMap) {
this.renderMapAsXml((Map) dataMapValue, wrapper, cycle);
this.xmlString += NEW_LINE;
}
else {
this.xmlString += this.makeTabSpace(cycle - 1) + "<" + wrapper + "><![CDATA[";
this.xmlString += dataMapValue;
this.xmlString += "]]></" + wrapper + '>' + NEW_LINE;
}
}
}
private void renderMapAsXml(Map dataMap, String wrapper, int cycle) {
if (cycle == 0) {
this.xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + NEW_LINE;
}
wrapper = "" + wrapper;
wrapper = wrapper.trim();
if (!wrapper.matches(MATCHER_1)) {
wrapper = "obj_" + wrapper;
}
wrapper = wrapper.replaceAll(MATCHER_REPLACE, "_");
if (cycle > 0) {
this.xmlString += this.makeTabSpace(cycle - 1) + '<' + wrapper;
}
for (Object object : dataMap.entrySet()) {
Map.Entry entry = (Map.Entry) object;
Object dataMapKey = entry.getKey();
Object dataMapValue = entry.getValue();
if (dataMapKey.toString().equalsIgnoreCase("<<attributes>>")) {
Map attributeMap = (Map) dataMapValue;
for (Object objectAttribute : attributeMap.entrySet()) {
Map.Entry entryAttribute = (Map.Entry) objectAttribute;
this.xmlString += " " + entryAttribute.getKey() + "='" + entryAttribute.getValue() + "'";
}
}
}
if (cycle > 0) {
this.xmlString += '>' + NEW_LINE;
}
int otherTags = 0;
try {
for (Object object : dataMap.entrySet()) {
Map.Entry entry = (Map.Entry) object;
Object dataMapKey = entry.getKey();
Object dataMapValue = entry.getValue();
if (!dataMapKey.toString().equalsIgnoreCase("<<attributes>>")) {
if (dataMapValue instanceof List) {
this.renderListAsXml((List) dataMapValue, "" + dataMapKey, cycle + 1);
otherTags++;
}
else if (dataMapKey.toString().startsWith("<<")) {
this.xmlString = this.xmlString.substring(0, this.xmlString.length() - this.NEW_LINE.length());
this.xmlString += "<![CDATA[";
this.xmlString += dataMapValue + "]]>";
}
else if (dataMapValue instanceof Map || dataMapValue instanceof HashMap) {
this.renderMapAsXml((HashMap) dataMapValue, "" + dataMapKey, cycle + 1);
this.xmlString += NEW_LINE;
otherTags++;
}
else {
dataMapKey = "" + dataMapKey;
dataMapKey = dataMapKey.toString().trim();
if (!dataMapKey.toString().matches(MATCHER_1)) {
dataMapKey = "obj_" + dataMapKey;
}
dataMapKey = dataMapKey.toString().replaceAll(MATCHER_REPLACE, "_");
if (dataMapValue != null) {
dataMapValue = "" + dataMapValue;
dataMapValue = dataMapValue.toString().replaceAll("]]>", "]]>");
}
this.xmlString += this.makeTabSpace(cycle);
this.xmlString += ('<' + dataMapKey.toString() + "><![CDATA[");
this.xmlString += dataMapValue + "]]></";
this.xmlString += dataMapKey.toString() + '>' + NEW_LINE;
otherTags++;
}
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
if (cycle > 0) {
this.xmlString += this.makeTabSpace(otherTags == 0 ? otherTags : cycle - 1) + "</" + wrapper + ">";
}
}
private String makeTabSpace(int numberOfTabs) {
String returnString = "";
for (int index = 1; index <= numberOfTabs; index ++) {
returnString += " ";
}
return returnString;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<rootTag>
<dataList>
<id><![CDATA[0]]></id>
<roll><![CDATA[Roll: 0]]></roll>
<name><![CDATA[Name: 0]]></name>
</dataList>
<dataList>
<id><![CDATA[1]]></id>
<roll><![CDATA[Roll: 1]]></roll>
<name><![CDATA[Name: 1]]></name>
</dataList>
<message><![CDATA[Thank you for generating this XML.]]></message>
<dataMap>
<user2 id='20' attr-name='Name == 40'>
<id><![CDATA[2]]></id>
<roll><![CDATA[Roll: 2]]></roll>
<name><![CDATA[Name: 2]]></name>
</user2>
<user1 id='10' attr-name='Name == 20'>
<id><![CDATA[1]]></id>
<roll><![CDATA[Roll: 1]]></roll>
<name><![CDATA[Name: 1]]></name>
</user1>
<listMap>
<id><![CDATA[0]]></id>
<roll><![CDATA[Roll: 0]]></roll>
<name><![CDATA[Name: 0]]></name>
</listMap>
<listMap>
<id><![CDATA[1]]></id>
<roll><![CDATA[Roll: 1]]></roll>
<name><![CDATA[Name: 1]]></name>
</listMap>
</dataMap>
<success><![CDATA[true]]></success>
</rootTag>
No comments:
Post a Comment