diff --git a/lib/builder.js b/lib/builder.js index 58f36384..fba09033 100644 --- a/lib/builder.js +++ b/lib/builder.js @@ -60,9 +60,18 @@ for (index in obj) { if (!hasProp.call(obj, index)) continue; child = obj[index]; - for (key in child) { - entry = child[key]; - element = render(element.ele(key), entry).up(); + if (index === attrkey) { + if (typeof child === "object") { + for (attr in child) { + value = child[attr]; + element = element.att(attr, value); + } + } + } else { + for (key in child) { + entry = child[key]; + element = render(element.ele(key), entry).up(); + } } } } else { diff --git a/src/builder.coffee b/src/builder.coffee index 5653fde0..ca8555d0 100644 --- a/src/builder.coffee +++ b/src/builder.coffee @@ -51,8 +51,14 @@ class exports.Builder else if Array.isArray obj # fix issue #119 for own index, child of obj - for key, entry of child - element = render(element.ele(key), entry).up() + # allow setting attributes for parents with multiple childrens + if index is attrkey + if typeof child is "object" + for attr, value of child + element = element.att(attr, value) + else + for key, entry of child + element = render(element.ele(key), entry).up() else for own key, child of obj # Case #1 Attribute diff --git a/test/builder.test.coffee b/test/builder.test.coffee index e9c12be3..47efa292 100644 --- a/test/builder.test.coffee +++ b/test/builder.test.coffee @@ -281,3 +281,20 @@ module.exports = actual = builder.buildObject obj diffeq expected, actual test.finish() + + 'test building obj with array and attributes': (test) -> + expected = """ + + + 10 + 12 + + + """ + opts = cdata: true + builder = new xml2js.Builder opts + obj = [{"MsgId": 10}, {"MsgId2": 12}] + obj.$ = {"name": "myName"} + actual = builder.buildObject obj + diffeq expected, actual + test.finish()