0

I am working on harmonizing data in MarkLogic using javascript. Currently, for my output, I am able to display all the child elements Activity but the problem is the parent Activities is also being displayed in duplicate.

Here is the current output, where <Activities> only appear for every Activity:

<Activities datatype="array">
 <Activity>
   <ActivityCrewSize>10</ActivityCrewSize>
   <ActivitySeqNo>1</ActivitySeqNo>
   <ActivityDesc/>
 </Activity>
</Activities>
<Activities datatype="array">
 <Activity>
   <ActivityCrewSize>23</ActivityCrewSize>
   <ActivitySeqNo>2</ActivitySeqNo>
   <ActivityDesc/>
 </Activity>
</Activities>
<Activities datatype="array">
 <Activity>
   <ActivityCrewSize>50</ActivityCrewSize>
   <ActivitySeqNo>3</ActivitySeqNo>
   <ActivityDesc/>
 </Activity>
</Activities>

And here is my desired output, where <Activities> only appear once

<Activities datatype="array">
 <Activity>
   <ActivityCrewSize>10</ActivityCrewSize>
   <ActivitySeqNo>1</ActivitySeqNo>
   <ActivityDesc/>
 </Activity>
 <Activity>
   <ActivityCrewSize>23</ActivityCrewSize>
   <ActivitySeqNo>2</ActivitySeqNo>
   <ActivityDesc/>
 </Activity>
 <Activity>
   <ActivityCrewSize>50</ActivityCrewSize>
   <ActivitySeqNo>3</ActivitySeqNo>
   <ActivityDesc/>
 </Activity>
</Activities>

Below is my current code for the current output:

obj.Activities = [];

let act = {
    '$type': 'Activity',
    '$version': '0.0.1',
     } 
  
for (const item of activities) {

 act.ActivityCrewSize = fn.normalizeSpace(hl.elementText(item, "CrewSize", true)); 
 act.ActivitySeqNo = fn.normalizeSpace(hl.elementText(item, "SeqNo", true)); 
 act.ActivityDesc = hl.elementText(item, null, true);

 obj.Activities.push(act); 
}

return obj;
Mads Hansen
  • 63,927
  • 12
  • 112
  • 147
Ryan
  • 175
  • 9
  • if you could provide a bit of sample data and extend your code to show how these JSON objects are being converted to XML, it would be a lot easier to help with your question. – Dave Cassel Aug 20 '18 at 15:03

2 Answers2

0

Not a Javascript guy, but if you wrap your input with another root element and then run the following xquery code on Qconsole, you will get the desired result that you want.

`

let $doc := <acts>
<Activities datatype="array">
    <Activity>
      <ActivityCrewSize>10</ActivityCrewSize>
      <ActivitySeqNo>1</ActivitySeqNo>
      <ActivityDesc/>
    </Activity>
</Activities>
<Activities datatype="array">
    <Activity>
      <ActivityCrewSize>23</ActivityCrewSize>
      <ActivitySeqNo>2</ActivitySeqNo>
      <ActivityDesc/>
    </Activity>
</Activities>
<Activities datatype="array">
    <Activity>
      <ActivityCrewSize>50</ActivityCrewSize>
      <ActivitySeqNo>3</ActivitySeqNo>
      <ActivityDesc/>
    </Activity>
</Activities>
</acts>
return 
<Activities datatype="array">
{
for $each in $doc/Activities/Activity
return $each
}

`

Amit Gope
  • 120
  • 1
  • 10
0

If you create a separate JavaScript object for each item, does that produce the desired result?

Something along the lines of:

obj.Activities = [];

for (const item of activities) {
    obj.Activities.push({
    '$type': 'Activity',
    '$version': '0.0.1',
    ActivityCrewSize: fn.normalizeSpace(hl.elementText(item, "CrewSize", true)),
    ActivitySeqNo, fn.normalizeSpace(hl.elementText(item, "SeqNo", true)),
    ActivityDesc: hl.elementText(item, null, true)
     });
}

return obj;

Alternatively, NodeBuilder can construct the XML directly:

http://docs.marklogic.com/guide/jsref/api#id_90865

ehennum
  • 7,295
  • 13
  • 9
  • Hi @ehennum, thanks for your response. I tried this suggestion but parent Activities is still displayed in duplicate. – Ryan Aug 28 '18 at 08:38
  • As Dave Casell suggested, maybe the next step is to revise the question to show how you're transforming the JSON to XML. – ehennum Aug 28 '18 at 19:40