var fs = require('fs'), xml2js = require('xml2js'); var parser = new xml2js.Parser(); fs.readFile(__dirname + '/company.xml', function(err, data) { parser.parseString(data, function (err, result) { var team = result.company['team-members'][0]['team-member']; var lines = []; team.forEach(member => { // create a line for each review, with the email as the first column var reviews = member.reviews[0].review; if (!reviews) return; var reviewLines = reviews.map(review => [ member.email[0], ...Object.keys(review).map(key => { var item = review[key][0]; // for the review Q&A, condense them into one field if (key === 'reviewee-answers' || key === 'reviewer-answers') { // the answers are in a property like 'reviewee-answer' // so chop the 's' off the end of the key item = item[key.slice(0, key.length - 1)]; if (!item) { return key + ''; } item = item.map(q => { var question = q['baked-review-question'][0].content[0]; var answer = q.content[0]; return `${question} // ${safeEscapeChars(answer) || 'n/a'}`; }).join(' // '); } return key + ': ' + (safeEscapeChars(item) || 'n/a'); }) ].join('\t')); lines = lines.concat(reviewLines); }); fs.writeFile(__dirname + '/output.tsv', lines.join('\n'), function(err) { if (err) console.error(err); console.log(`OK: ${lines.length}`); }); }); }); function safeEscapeChars(item) { return item && item.replace && item.replace(/\t/g,'\\t').replace(/\r?\n/g, '\\n'); }