function json2xml() { // console.clear(); var obj = localStorage.getItem("json"); // var obj = `{ // "question_paper_title": "


", // "question_paper_description": "


", // "max_marks": "", // "course_ID": "", // "course_Code": "", // "subject_ID": "", // "subject_Code": "", // "paper_No": "", // "subject_Name": "", // "sub_Paper_Prefix": "", // "question_Paper_uuid": "f676ad21-b0d2-4a80-8c77-6cd2b35f1b34", // "sections": [ // { // "section_title": "

0

", // "section_description": "


", // "section_marks": "0", // "section_uuid": "7c62e594-3b93-444f-9fa6-a05f87869db6", // "section_display_marks": true, // "section_attempt_any": "", // "questions": [ // { // "question": "

1

", // "question_description": "


", // "question_type": "group", // "question_sub_type": false, // "is_math_enabled": false, // "display_marks": true, // "marks": "", // "choice_question_uuid": "40f37294-e7cb-4f19-9166-72f7a04f6391", // "answers": [ // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "387d9b85-4702-4e77-a8c3-29d713b7689e", // "no": "a" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "1a6be686-9e7c-4b07-bf15-b9e07a01fd62", // "no": "b" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "0640c05b-522e-422c-8050-0d5982aa3c74", // "no": "c" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "e59f90b0-79d5-413e-85a4-ee3c181230d8", // "no": "d" // } // ], // "correct_answer": ["1a6be686-9e7c-4b07-bf15-b9e07a01fd62"] // }, // { // "question": "

2

", // "question_description": "


", // "question_type": "group", // "question_sub_type": false, // "is_math_enabled": false, // "display_marks": true, // "marks": "", // "choice_question_uuid": "7a1c83e7-e9ae-4424-9336-6135eaa6b833", // "answers": [ // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "0cbb8330-8ce9-4d69-b547-68cee529a636", // "no": "a" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "25dc4fdc-7bcf-4bea-aaa5-dc42a22c08b5", // "no": "b" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "5b0da327-076f-488c-a46e-0b8251c83283", // "no": "c" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "d3934305-d6fd-4601-8b1b-08067f47a8dd", // "no": "d" // } // ], // "correct_answer": ["d3934305-d6fd-4601-8b1b-08067f47a8dd"] // }, // { // "question": "

3

", // "question_description": "


", // "question_type": "group", // "question_sub_type": false, // "is_math_enabled": false, // "display_marks": true, // "marks": "", // "choice_question_uuid": "6f929b53-9ebc-40fb-800e-46c42b75f2d9", // "answers": [ // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "f839312c-8de5-4cd5-8d6c-3ffd3b9efea6", // "no": "a" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "905db769-82b2-4240-af06-fe0b15ee1f73", // "no": "b" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "6a16126f-8100-49f8-ae33-71d4848030cf", // "no": "c" // }, // { // "choice_name": "


", // "is_math_enabled": false, // "choice_uuid": "143f648a-d52c-42ff-9428-1c080326e1c8", // "no": "d" // } // ], // "correct_answer": ["143f648a-d52c-42ff-9428-1c080326e1c8", "6a16126f-8100-49f8-ae33-71d4848030cf"] // } // ] // } // ] // } // ` // console.log(obj); // console.log('***********************************************************'); function createXMLDocument(namespace = null) { if (typeof document.implementation.createDocument === 'function') { return document.implementation.createDocument(namespace, '', null); } else if (typeof ActiveXObject !== 'undefined') { // For Internet Explorer var versions = ['MSXML2.DOMDocument.6.0', 'MSXML2.DOMDocument.3.0', 'Microsoft.XMLDOM']; for (var i = 0; i < versions.length; i++) { try { var xmlDoc = new ActiveXObject(versions[i]); return xmlDoc; } catch (e) { console.log(e); } } } throw new Error('Your browser or environment does not support XML document creation.'); } function createElementWithText(xmlDoc, parentElement, elementName, textContent, attributes = {}) { var element = xmlDoc.createElement(elementName); if (Object.keys(attributes).length != 0) { for (const key in attributes) { element.setAttribute(key, attributes[key]) } } element.appendChild(xmlDoc.createTextNode(textContent)); return parentElement.appendChild(element); } function createStandaloneXMLNode(tagName, attributes = {}, textContent = '') { // console.log(attributes); const xmlDoc = createXMLDocument(); const element = xmlDoc.createElement(tagName); for (const attributeName in attributes) { element.setAttribute(attributeName, attributes[attributeName]); } if (textContent !== '') { const textNode = xmlDoc.createTextNode(textContent); element.appendChild(textNode); } return { 'doc': xmlDoc, 'element': element }; } function getXMLNodesOfQuestionData(question) { var { doc, element } = createStandaloneXMLNode('Question', { "xsi:type": (question['question_type'] == 'text' ? 'DescriptiveQuestion' : 'MultiChoiceQuestion'), 'Id': (question['question_type'] == 'text' ? question['text_question_uuid'] : question['choice_question_uuid']), 'type': (question['question_type'] == 'text' ? 'Descriptive' : 'Mcq') }, ''); var questionTitle = createElementWithText(doc, element, 'Text', question['question']); var questionDesc = createElementWithText(doc, element, 'Subtext', question['question_description']); var marks = createElementWithText(doc, element, 'Marks', question['marks']); var display_marks = createElementWithText(doc, element, 'DispalyMarks', (question['display_marks'] === true ? 'true' : 'false'), {}); var is_math_enabled = createElementWithText(doc, element, 'Math', (question['is_math_enabled'] === true ? 'true' : 'false'), {}); if (question['question_type'] == 'group') { var hasMultipleAnswers = createElementWithText(doc, element, 'HasMultipleAnswers', (question['question_sub_type'] === true ? 'true' : 'false'), {}); var choicesElement = createElementWithText(doc, element, 'Choices', '', {}); for (choice in question['answers']) { var choiceElement = createElementWithText(doc, choicesElement, 'Choice', '', {}); var id = createElementWithText(doc, choiceElement, 'Id', question['answers'][choice]['choice_uuid'], {}); var no = createElementWithText(doc, choiceElement, 'No', question['answers'][choice]['no'], {}); var text = createElementWithText(doc, choiceElement, 'Text', question['answers'][choice]['choice_name'], {}); var is_math_enabled = createElementWithText(doc, choiceElement, 'Math', (question['answers'][choice]['is_math_enabled'] === true ? 'true' : 'false'), {}); } // choicesElement.appendChild(); } return element; } function getXMLNodesOfGroupQuestionData(singleQuestion){ //create question group title related xml nodes var { doc, element } = createStandaloneXMLNode('Question', { 'xsi:type': 'QuestionGroup', 'Id': singleQuestion['group_uuid'], 'Type': 'QuestionGroup', 'No': singleQuestion['group_title'], 'Order': 0 }, ''); // var groupQuestionElement = createElementWithText(xmlDoc, sectionElement, 'Question', '', { // 'xsi:type': 'QuestionGroup', // 'Id': singleQuestion['group_uuid'], // 'Type': 'QuestionGroup', // 'No': singleQuestion['group_title'], // 'Order': 0 // }); var groupQuestionTitle = createElementWithText(doc, element, 'Text', singleQuestion['group_title']); var groupQuestionDesc = createElementWithText(doc, element, 'Subtext', singleQuestion['group_description']); var groupQuestionMarks = createElementWithText(doc, element, 'Marks', singleQuestion['group_marks']); var groupQuestionDisplayMarks = createElementWithText(doc, element, 'DisplayMarks', (singleQuestion['group_display_marks'] === true ? 'true' : 'false' )); var groupQuestionAttemptAny = createElementWithText(doc, element, 'AttemptAny', singleQuestion['group_attempt_any'] ); var groupQuestionItemsElement = createElementWithText(doc, element, 'Items', ''); //gather questions data inside question group if (singleQuestion['questions'].length != 0) { var tempGroupQuestions = singleQuestion['questions']; //looping each questions indise question group and attach it to group items node for (gquestion in tempGroupQuestions) { var singleGQuestion = tempGroupQuestions[gquestion]; // console.log('singleGQuestion-'+gquestion); // console.log(singleGQuestion); // console.log('***********************************'); if (singleGQuestion.hasOwnProperty('question_type')) // normal questions inside group questions { console.log('Single Question'); var singleGQuestionElement = getXMLNodesOfQuestionData(singleGQuestion); //attach into group items node groupQuestionItemsElement.appendChild(singleGQuestionElement); } else { // console.log('Group Question'); var multiGQuestionElement = getXMLNodesOfGroupQuestionData(singleGQuestion); groupQuestionItemsElement.appendChild(multiGQuestionElement); } } } return element; } //start of the busi logic questionPaper = JSON.parse(obj); var ns1 = 'http://www.w3.org/2001/XMLSchema'; var xmlDoc = createXMLDocument(namespace = ns1); var rootElement = xmlDoc.createElement('QuestionPaper'); rootElement.setAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance'); rootElement.setAttribute('xmlns:xsd','http://www.w3.org/2001/XMLSchema'); rootElement.setAttribute('Id', questionPaper.question_Paper_uuid); rootElement.setAttribute('MaxMarks',questionPaper.max_marks); rootElement.setAttribute('CourseId',questionPaper.course_ID); rootElement.setAttribute('CourseCode',questionPaper.course_Code); rootElement.setAttribute('SubjectId',questionPaper.subject_ID); rootElement.setAttribute('SubjectCode',questionPaper.subject_Code); rootElement.setAttribute('PaperNo',questionPaper.paper_No); rootElement.setAttribute('SubjectName',questionPaper.subject_Name); rootElement.setAttribute('SubPaperPrefix',questionPaper.sub_Paper_Prefix); xmlDoc.appendChild(rootElement); createElementWithText(xmlDoc, rootElement, 'Title', questionPaper.question_paper_title); createElementWithText(xmlDoc, rootElement, 'Subtitle', questionPaper.question_paper_description); var rootItemsElement = createElementWithText(xmlDoc, rootElement, 'Items', '', ); //iterate each sections for (section in questionPaper['sections']) { //create section related xml nodes var tempSection = questionPaper['sections'][section]; // console.log(tempSection); var sectionElement = createElementWithText(xmlDoc, rootItemsElement, 'Question', '', { 'xsi:type': 'QuestionPaperSection', 'Id': tempSection['section_uuid'], 'Type': 'Section', 'No': tempSection['section_title'], 'Order': 0 }); var sectionTitle = createElementWithText(xmlDoc, sectionElement, 'Text', tempSection['section_title']); var sectionDesc = createElementWithText(xmlDoc, sectionElement, 'Subtext', tempSection['section_description']); var sectionMarks = createElementWithText(xmlDoc, sectionElement, 'Marks', tempSection['section_marks']); var sectionDisplayMark = createElementWithText(xmlDoc, sectionElement, 'DisplayMarks', (tempSection['section_display_marks'] === true ? 'true' : 'false')); var sectionAttempAny = createElementWithText(xmlDoc, sectionElement, 'AttemptAny', tempSection['section_attempt_any']); var sectionItemElement = createElementWithText(xmlDoc, sectionElement, 'Items', '', ); //gather questions data if (tempSection['questions'].length != 0) { for (question in tempSection['questions']) { var singleQuestion = tempSection['questions'][question]; //for Separate Correct Answer From MCQ if(singleQuestion.question_type == 'group'){ separateCorrectAnswerFromMcqAsJson(singleQuestion) } if (singleQuestion.hasOwnProperty('question_type')) // normal questions { var singleQuestionElement = getXMLNodesOfQuestionData(singleQuestion); //attach each single question into section item node sectionItemElement.appendChild(singleQuestionElement); } else // handle question group { var groupQuestionElement = getXMLNodesOfGroupQuestionData(singleQuestion); sectionItemElement.appendChild(groupQuestionElement); } } } rootItemsElement.appendChild(sectionElement); } rootElement.appendChild(rootItemsElement); // Serialize the XML to a string var xmlString = new XMLSerializer().serializeToString(xmlDoc); // console.log(xmlString); localStorage.setItem("xml", xmlString); } const outputJson = { questions: [] }; function separateCorrectAnswerFromMcqAsJson(tempSection) { const questionId = tempSection.choice_question_uuid; const answers = tempSection.correct_answer; // Create an object for each question and push it to the output array outputJson.questions.push({ questionId, answers }); // Convert the output object to JSON string const outputJsonString = JSON.stringify(outputJson, null, 2); localStorage.setItem("Correct_Answer_Json", outputJsonString); console.log('outputJsonString : ', outputJsonString); }