Java Help with Logic in XML SAX Handler -
i trying set sax handler parse xml following structure:
<hours> <set name="business"> <mo> <open>09:00:00</open> <close>17:00:00</close> </mo> <tu> <open>09:00:00</open> <close>17:00:00</close> </tu> <we> <open>09:00:00</open> <close>17:00:00</close> </we> <th> <open>09:00:00</open> <close>17:00:00</close> </th> <fr> <open>09:00:00</open> <close>17:00:00</close> </fr> <sa/> <su/> </set> <set name="lastcollection"> <mo> <close>17:00:00</close> </mo> <tu> <close>17:00:00</close> </tu> <we> <close>17:00:00</close> </we> <th> <close>17:00:00</close> </th> <fr> <close>17:00:00</close> </fr> <sa/> <su/> </set> </hours>
i running problems, however. code value of open , close in mo, not in of other days of week. can find flaw in logic? here handler code:
public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception { if (localname.equalsignorecase("set") && attributes.getvalue("name").equalsignorecase( "business")) { inbusiness = true; } else if (localname.equalsignorecase("set") && attributes.getvalue("name").equalsignorecase( "lastcollection")) { inlastcollection = true; } else if (localname.equalsignorecase("mo")) { inmonday = true; } else if (localname.equalsignorecase("tu")) { intuesday = true; } else if (localname.equalsignorecase("we")) { inwednesday = true; } else if (localname.equalsignorecase("th")) { inthursday = true; } else if (localname.equalsignorecase("fr")) { infriday = true; } else if (localname.equalsignorecase("sa")) { insaturday = true; } else if (localname.equalsignorecase("su")) { insunday = true; } else if (localname.equalsignorecase("open")) { inopen = true; } else if (localname.equalsignorecase("close")) { inclose = true; } } public void characters(char ch[], int start, int length) throws saxexception { value = value + new string(ch, start, length).trim(); } public void endelement(string uri, string name, string qname) throws saxexception { if (inbusiness) { bhours = new businesshours(); if (inmonday) { if (inopen) { bhours.setmondayopen(value); inopen = false; } else if (inclose) { bhours.setmondayclose(value); inclose = false; } inmonday = false; } else if (intuesday) { if (inopen) { bhours.settuesdayopen(value); inopen = false; } else if (inclose) { bhours.settuesdayclose(value); inclose = false; } intuesday = false; } else if (inwednesday) { if (inopen) { bhours.setwednesdayopen(value); inopen = false; } else if (inclose) { bhours.setwednesdayclose(value); inclose = false; } inwednesday = false; } else if (inthursday) { if (inopen) { bhours.setthursdayopen(value); inopen = false; } else if (inclose) { bhours.setthursdayclose(value); inclose = false; } inthursday = false; } else if (infriday) { if (inopen) { bhours.setfridayopen(value); inopen = false; } else if (inclose) { bhours.setfridayclose(value); inclose = false; } infriday = false; } else if (insaturday) { if (inopen) { bhours.setsaturdayopen(value); inopen = false; } else if (inclose) { bhours.setsaturdayclose(value); inclose = false; } insaturday = false; } else if (insunday) { if (inopen) { bhours.setsundayopen(value); inopen = false; } else if (inclose) { bhours.setsundayclose(value); inclose = false; } insunday = false; } myloc.setbusinesshours(bhours); inbusiness = false; } else if (inlastcollection) { chours = new lastcollectionhours(); if (inmonday) { if (inopen) { chours.setmondayopen(value); inopen = false; } else if (inclose) { chours.setmondayclose(value); inclose = false; } inmonday = false; } else if (intuesday) { if (inopen) { chours.settuesdayopen(value); inopen = false; } else if (inclose) { chours.settuesdayclose(value); inclose = false; } intuesday = false; } else if (inwednesday) { if (inopen) { chours.setwednesdayopen(value); inopen = false; } else if (inclose) { chours.setwednesdayclose(value); inclose = false; } inwednesday = false; } else if (inthursday) { if (inopen) { chours.setthursdayopen(value); inopen = false; } else if (inclose) { chours.setthursdayclose(value); inclose = false; } inthursday = false; } else if (infriday) { if (inopen) { chours.setfridayopen(value); inopen = false; } else if (inclose) { chours.setfridayclose(value); inclose = false; } infriday = false; } else if (insaturday) { if (inopen) { chours.setsaturdayopen(value); inopen = false; } else if (inclose) { chours.setsaturdayclose(value); inclose = false; } insaturday = false; } else if (insunday) { if (inopen) { chours.setsundayopen(value); inopen = false; } else if (inclose) { chours.setsundayclose(value); inclose = false; } insunday = false; } myloc.setlastcollectionhours(chours); inlastcollection = false; } }
updated code:
public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception { value = new string(); if (localname.equalsignorecase("set") && attributes.getvalue("name").equalsignorecase("business")) { currentelement = 1; bhours = new businesshours(); } else if (localname.equalsignorecase("set") && attributes.getvalue("name").equalsignorecase( "lastcollection")) { currentelement = 2; chours = new lastcollectionhours(); } else if (localname.equalsignorecase("mo")) { day = 1; } else if (localname.equalsignorecase("tu")) { day = 2; } else if (localname.equalsignorecase("we")) { day = 3; } else if (localname.equalsignorecase("th")) { day = 4; } else if (localname.equalsignorecase("fr")) { day = 5; } else if (localname.equalsignorecase("sa")) { day = 6; } else if (localname.equalsignorecase("su")) { day = 7; } else if (localname.equalsignorecase("open")) { open = 1; } else if (localname.equalsignorecase("close")) { open = 2; } } public void characters(char ch[], int start, int length) throws saxexception { value = value + new string(ch, start, length).trim(); } // end method characters public void endelement(string uri, string name, string qname) throws saxexception { if (name.equalsignorecase("set") && currentelement == 1) { myloc.setbusinesshours(bhours); } else if (name.equalsignorecase("set") && currentelement == 2) { myloc.setlastcollectionhours(chours); } if (currentelement == 1) { if (day == 1) { if (open == 1) { bhours.setmondayopen(value); } else if (open == 2) { bhours.setmondayclose(value); } } else if (day == 2) { if (open == 1) { bhours.settuesdayopen(value); } else if (open == 2) { bhours.settuesdayclose(value); } } else if (day == 3) { if (open == 1) { bhours.setwednesdayopen(value); } else if (open == 2) { bhours.setwednesdayclose(value); } } else if (day == 4) { if (open == 1) { bhours.setthursdayopen(value); } else if (open == 2) { bhours.setthursdayclose(value); } } else if (day == 5) { if (open == 1) { bhours.setfridayopen(value); } else if (open == 2) { bhours.setfridayclose(value); } } else if (day == 6) { if (open == 1) { bhours.setsaturdayopen(value); } else if (open == 2) { bhours.setsaturdayclose(value); } } else if (day == 7) { if (open == 1) { bhours.setsundayopen(value); } else if (open == 2) { bhours.setsundayclose(value); } } } else if (currentelement == 2) { if (day == 1) { if (open == 1) { chours.setmondayopen(value); } else if (open == 2) { chours.setmondayclose(value); } } else if (day == 2) { if (open == 1) { chours.settuesdayopen(value); } else if (open == 2) { chours.settuesdayclose(value); } } else if (day == 3) { if (open == 1) { chours.setwednesdayopen(value); } else if (open == 2) { chours.setwednesdayclose(value); } } else if (day == 4) { if (open == 1) { chours.setthursdayopen(value); } else if (open == 2) { chours.setthursdayclose(value); } } else if (day == 5) { if (open == 1) { chours.setfridayopen(value); } else if (open == 2) { chours.setfridayclose(value); } } else if (day == 6) { if (open == 1) { chours.setsaturdayopen(value); } else if (open == 2) { chours.setsaturdayclose(value); } } else if (day == 7) { if (open == 1) { chours.setsundayopen(value); } else if (open == 2) { chours.setsundayclose(value); } } } }
thanks!
on line 116 setting inbusiness = false - set after monday's open/close. next time around fails if(inbusiness) on line 44.
instead of using inbusiness boolean, use int indicator follows:
private int curelement = 0;
public void startelement(string uri, string localname, string qname, attributes attributes) throws saxexception {
if (localname.equalsignorecase("set") && attributes.getvalue("name").equalsignorecase( "business")) { curelement = 1; } else if (localname.equalsignorecase("set") && attributes.getvalue("name").equalsignorecase( "lastcollection")) { curelement = 2; }
......
}
public void endelement(string uri, string name, string qname) throws saxexception {
if (curelement == 1) { .... //remove inbusiness= false; } else if (curelement == 2) { ... //remove inlastcollection = false; }
}
Comments
Post a Comment