In a separated function called searchXML, where some parameters are passed in and I am parsing an xml file to return some specific values based on the parameters and save those values to an object. Then, in another function, call the searchXML() and save the result to an object. Unfortunately, that object is turning out to be empty. I am relatively new to javascript, so I am not sure if its my logic or syntax that is causing the error.
The xml is in this format:
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<Row>
<Tab>MF_Act</Tab>
<Category>Product Store Sessions </Category>
<_2013_01_31>1</_2013_01_31>
<_2013_02_28>2</_2013_02_28>
<_2013_03_31>3</_2013_03_31>
<_2013_04_30>4</_2013_04_30>
<_2013_05_31>5</_2013_05_31>
<_2013_06_30>6</_2013_06_30>
<_2013_07_31>7</_2013_07_31>
<_2013_08_31>8</_2013_08_31>
<_2013_09_30>9</_2013_09_30>
<_2013_10_31>10</_2013_10_31>
<_2013_11_30>11</_2013_11_30>
<_2013_12_31>12</_2013_12_31>
<FY_2013>x</FY_2013>
<_2014_01_31>1</_2014_01_31>
<_2014_02_28>2</_2014_02_28>
<_2014_03_31>3</_2014_03_31>
<_2014_04_30>4</_2014_04_30>
<_2014_05_31>5</_2014_05_31>
<_2014_06_30>6</_2014_06_30>
<_2014_07_31>7</_2014_07_31>
<_2014_08_31>8</_2014_08_31>
<_2014_09_30>9</_2014_09_30>
<_2014_10_31>10</_2014_10_31>
<_2014_11_30>11</_2014_11_30>
<_2014_12_31>12</_2014_12_31>
<FY_2014>y</FY_2014>
</Row>
<Row>
<Tab>MF_Act</Tab>
<Category>YTD</Category>
<_2013_01_31>1</_2013_01_31>
<_2013_02_28>2</_2013_02_28>
<_2013_03_31>3</_2013_03_31>
<_2013_04_30>4</_2013_04_30>
<_2013_05_31>5</_2013_05_31>
<_2013_06_30>6</_2013_06_30>
<_2013_07_31>7</_2013_07_31>
<_2013_08_31>8</_2013_08_31>
<_2013_09_30>9</_2013_09_30>
<_2013_10_31>10</_2013_10_31>
<_2013_11_30>11</_2013_11_30>
<_2013_12_31>12</_2013_12_31>
<FY_2013>r</FY_2013>
<_2014_01_31>1</_2014_01_31>
<_2014_02_28>2</_2014_02_28>
<_2014_03_31>3</_2014_03_31>
<_2014_04_30>4</_2014_04_30>
<_2014_05_31>5</_2014_05_31>
<_2014_06_30>6</_2014_06_30>
<_2014_07_31>7</_2014_07_31>
<_2014_08_31>8</_2014_08_31>
<_2014_09_30>9</_2014_09_30>
<_2014_10_31>10</_2014_10_31>
<_2014_11_30>11</_2014_11_30>
<_2014_12_31>12</_2014_12_31>
<FY_2014>t</FY_2014>
</Row>
</Root>
And my searchXML code:
function searchXML(xml, goalTab, goalCategory){
console.log('in search xml');
//get the current year in 4 digits (yyyy)
var year = new Date().getFullYear();
//gets the string value of the 2 digit number of the previous completed month (ie: currMonth = April (04), prevMonth = March (03))
var prevMonth = new Date().getMonth().toString();
if(prevMonth.toString().length == 1){
prevMonth = '0'+prevMonth.toString();
}
//check for leap year
if(year % 4 == 0){
var feb = 29;
}else{
var feb = 28;
}
//make array for number of days per month in this year
var daysInMonths = [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
//get the row offset for the particular month
var rowOffset_Month = (year - 2013)*12 + 2 + parseInt(prevMonth);
var result = null;
$(xml).find('Row').each(function(){ // for each Row in xml
console.log('-------new row------')
var row = this;
var boolTab = $(row).find('Tab').text() == goalTab;
var boolCategory = $(row).find('Category').text() == goalCategory;
console.log(boolCategory);
console.log(boolTab);
if (boolCategory && boolTab) {
console.log('found match');
var result= {
//get the row that corresponds with the calculated row offset
//month : arr[rowOffset_Month][i],
month : $(row).find('_'+year+'_'+prevMonth+'_'+daysInMonths[parseInt(prevMonth) - 1]).text(), //-----------------check for errors here--------------------
//get the last row, which corresponds with the 2014 ytd
// ytd : arr[arr[1].length - 1][i]
ytd : $(row).find('FY_' + year).text() //-----------------check for errors here--------------------
}; //END result obj
};// END if
});// END jquery function
return result;
};
And then in a seperate function:
var ann_appStarts_plan = searchXML(xml, "MF_Act", "Product Store Sessions ");
console.log('plan month: ' + ann_appStarts_plan.month);
console.log('plan ytd: ' + ann_appStarts_plan.ytd);
And the error in Firebug:
TypeError: ann_appStarts_plan is null
console.log('plan month: ' + ann_appStarts_plan.month);
Your re-declaration of result
inside that callback function is probably the problem, though I'm not sure what that .find()
method does. If it's asynchronous, then the overall code won't work anyway.
Take away the var
here:
var result= {
That makes another variable, one inside the callback.
You're creating an "outer" result
:
var result = null;
$(xml).find('Row').each(function(){ // for each Row in xml
// ...
then assigning to a new, "inner" result
:
if (boolCategory && boolTab) {
console.log('found match');
var result= {
// ..
};
which is then discarded, and we return the original:
return result;
Lose the var
in your assignment:
if (boolCategory && boolTab) {
result= {
month : $(row).find('_'+year+'_'+prevMonth+'_'+daysInMonths[parseInt(prevMonth) - 1]).text(),
ytd : $(row).find('FY_' + year).text()
};
return false;
};
And return false
to quit the each()
loop now that a match has been found ( each()
will call the inner function once for each object in the list it's called on, but will stop if the inner function ever returns false
).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.