Search code examples
javascriptxmlyui

How to iterate data output from DataSchema XML


YUI().use("datatype-xml", "dataschema-xml", function(Y)
{
    var dataIn = Y.DataType.XML.parse(xmlData);
    schema = {
        resultListLocator: "song",
        resultFields: [{key:"title"}, {key:"artist"}, {key:"rank"}]
    },
    dataOut = Y.DataSchema.XML.apply(schema, dataIn);

    console.log(dataOut); <-- Display list of object
    console.log(dataOut.length); <--- Undefined
});

Everything seems correct when I log only dataOut (a list of object). But when I try to loop through that list, the length is undefined.

So how can I iterate through a list after applying DataSchema.XML ?


Solution

  • DataSchema's apply method returns an object with results and meta properties. The results property is an array that you can iterate over. Here's an example:

    YUI().use("datatype-xml", "dataschema-xml", function(Y) {
      var data_in = Y.DataType.XML.parse('<Response><Session>542235629</Session><Tracks  start="1" count="10" total="98" errorCount="0"  defaultSort="popularity+"  description="Top 100 Tracks"  name="Top 100 Tracks"  ><Track id="59672468" rating="-1" title="I Kissed A Girl"><Artist id="30326214" rating="-1">Katy Perry</Artist><ItemInfo><ChartPosition last="26" this="1"/></ItemInfo></Track><Track id="47973564" rating="-1" title="Shake It"><Artist id="45575683" rating="-1">Metro Station</Artist><ItemInfo><ChartPosition last="27" this="2"/></ItemInfo></Track><Track id="52207363" rating="-1" title="Bleeding Love"><Artist id="37956508" rating="-1">Leona Lewis</Artist><ItemInfo><ChartPosition last="28" this="3"/></ItemInfo></Track></Tracks></Response>'),
          schema = {
            metaFields: {
              session: "//Session", total:"//Tracks/@total"
            },
            resultListLocator: "//Track",
            resultFields: [
              {key:"song", locator:"@title"},
              {key:"artist", locator:"Artist"},
              {key:"rank", locator:"ItemInfo/ChartPosition/@this"}
            ]
          },
          data_out = Y.DataSchema.XML.apply(schema, data_in);
    
      Y.Array.each(data_out.results, function (data) {
        // ...
      })
    });