0

I am parsing a big XML document using a SAX parser, but after seeing an example of SAX parsing on Google, I am unable to parse this XML:

<?xml version="1.0" encoding="UTF-8"?>
<school title="The Clifton School" icon="" browserBackButtonTitle = "Clifton App" navBarColor = "#7eb432">
    <screen id = "1" backgroundColor = "" backgroundImg = "" templateId = "12" hasNavigationBar = "0" hasTabBar = "1" >
        <navigation-bar title = "" color = "#7eb432" backButtonTitle = "Back">
            <!--<navigation-item type = "1" action = "" />-->
        </navigation-bar>
        <tab-bar numberOfTabs = "4" >
            <tab-bar-item title = "Home" image = "tab_home.png" linkedScreen = "101" />
            <tab-bar-item title = "Calendar" image = "tab_calendar.png" linkedScreen = "102" />
            <tab-bar-item title = "Menu" image = "tab_menu.png" linkedScreen = "604" />
            <tab-bar-item title = "Directions" image = "tab_directions.png" linkedScreen = "401" />
            <tab-bar-item title = "Contact" image = "tab_contact.png" linkedScreen = "206" />
        </tab-bar>
    </screen>

This is not whole XML document. For parsing that, I made 5 property classes:

1) School

public class School 
{
    public String title;
    public String icon="";
    public String browserBackButtonTitle;
    public String navBarColor;
    public ArrayList<Screen> screenlist = new ArrayList<Screen>();
}

2) Screen

public class Screen 
{
    public String Id;
    public String backgroundColor;
    public String backgroundImg ; 
    public String templateId;
    public String hasNavigationBar;
    public String hasTabBar;
    public ArrayList<NavigationBar> objlistofNB = new ArrayList<NavigationBar>();
}

3) NavigationBar

public class NavigationBar 
{
    public String title;
    public String  color;
    public String backButtonTitle;
}

4) ScreenTabBar

public class ScreenTabBar
{
    private int numberOfTabs;
    private ArrayList<TabBarItem> objlistofTabBarItem = new ArrayList<TabBarItem>();
}

5) TabBarItem

public class TabBarItem
{
    public String Title;
    public String image;
    public String linkedScreen;
}

I overrode the startElement method in which I can't do how apply exact codition-

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
    super.startElement(uri, localName, qName, attributes);
    currentElement = true;

    if (localName.equals("school"))
    {
        /** Start */
        objschool = new School();
        schoolmap = new HashMap<String, String>();
        schoolmap.put("school_name", attributes.getValue("title"));
        schoolmap.put("school_icon", attributes.getValue("icon"));
        schoolmap.put("school_browserBackButtonTitle", attributes.getValue("browserBackButtonTitle"));
        schoolmap.put("school_navBarColor", attributes.getValue("navBarColor"));
        objschool = (School)parseProperty(objschool,schoolmap);
    }
    else if (localName.equals("screen"))
    {
        /** Get attribute value */
        objscreen = new Screen();
        screenmap.put("screen_id", attributes.getValue("id"));
        screenmap.put("screen_backgroundColor", attributes.getValue("backgroundColor"));
        screenmap.put("screen_backgroundImg",attributes.getValue("backgroundImg"));
        screenmap.put("screen_templateId",attributes.getValue("templateId"));
        screenmap.put("screen_hasNavigationBar",attributes.getValue("hasNavigationBar"));
        screenmap.put("screen_hasTabBar",attributes.getValue("hasTabBar"));
        objscreen =(Screen)parseProperty(objscreen,screenmap);
    }
    else if (localName.equals("navigation-bar"))
    {
        objnavBar = new NavigationBar();
        navimap.put("naviTitle",attributes.getValue("title"));
        navimap.put("navicolor",attributes.getValue("color"));
        navimap.put("navibackButtonTitle",attributes.getValue("backButtonTitle"));
        objnavBar =(NavigationBar)parseProperty(objnavBar,navimap);
    }
    else if (localName.equals("tab-bar"))
    {
        objtabBar = new ScreenTabBar();
        tabbarmap.put("numberOfTabs",attributes.getValue("numberOfTabs"));
        objtabBar = (ScreenTabBar)parseProperty(objtabBar, tabbarmap);
    }
    else if (localName.equals("tab-bar-item"))
    {
        objtabBaritem = new TabBarItem();
        tabbarmap.put("Title",attributes.getValue("title"));
        tabbarmap.put("Image",attributes.getValue("image"));
        tabbarmap.put("LinkedScreen",attributes.getValue("linkedScreen"));
    }
}

The parseProperty method is:

private Object parseProperty(Object t, Map<String,String> list) 
{
    Class c=null;
    String className[]=t.toString().split("@");
    try {
        String s = t.toString();
        c = Class.forName(className[0]);
        Field[] f = c.getDeclaredFields();
        //for(int i=0; i<list.entrySet().size();i++)
        //{
        for (String key : list.keySet()) {
            System.out.println("key/value: " + key + "/"+list.get(key));
            String attrname = key;
            for(int j=0; j<f.length;j++)
            {
                String s2=f[j].getName();
                if(s2.equals(attrname))
                {
                    f[j].set(t,list.get(key));
                }
            }
        }
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return t;
}

How I can parse the above XML by the above rules which were applied by me?

7
  • 1
    You seem to be using a SAX Parser. Take a look at the DOM parser, I'd wager you'll find it much easier to reason about. You can google "android dom parser" and get resources. Commented Mar 20, 2012 at 11:21
  • but xml size is very big can I use? Commented Mar 20, 2012 at 11:23
  • How big is "very big"? If "very" is indeed DOM-prohibitively big, I'd still take a look at other parsers. Blindly writing SAX (specially in Java) is a sneaky and time-consuming task. If you need a smaller memory footprint, Android has a PULL parser that works pretty much like SAX but has a (in my opinion) saner interface. Commented Mar 20, 2012 at 11:27
  • 30kb? That's nothing. Go for DOM. EDIT -- unless speed is also an issue. Do you want to asynchronously process the document as it is read, or can you afford to wait for the DOM parser? Commented Mar 20, 2012 at 11:31
  • stackoverflow.com/questions/4827168/… check this link...Hope it will help you... Commented Mar 20, 2012 at 11:36

1 Answer 1

0

Hi Please try this code you need to use correct position of tags.Hope this code will works

InputStream in =response.getEntity().getContent();

            DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();
            Document doc = builder.parse(in);
            String responseCode = "";
            String extendedMessage = "";
            if (doc != null) {
                NodeList nl = doc.getElementsByTagName("school");
                if (nl.getLength() > 0) {
                    Node node = nl.item(positionof tab-bar);
                   Node node1= node.getChildNodes().item(position of tab-bar-item);
                responseCode = node.getAttributes().getNamedItem("title");
            }

Please find the following code i parsed almost all child nodes and attribute values within readxml function as i dont have the link of that xml i used assets folder to read that xml file.With in sop statements can find how to get values from child nodes as well as attributes

public class XMLSaxParse extends Activity {
    /** Called when the activity is first created. */
    AssetManager assetManager;
    InputStream inputStream;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       try {
        inputStream=getAssets().open("sam.xml",Context.MODE_PRIVATE);
        readXML();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }



    }

    public void readXML()
    {


        try {
            DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();
            Document doc = builder.parse(inputStream);
            if (doc != null) {
                NodeList nl = doc.getElementsByTagName("screen");
                NodeList nodeList=doc.getChildNodes();
                System.out.println("Length of NodeList...................................");
               System.out.println("Displays id node name from screen tag..................................."+nl.item(0).getAttributes().item(0).getNodeName());
               System.out.println("Displays id node value from screen tag..................................."+nl.item(0).getAttributes().item(0).getNodeValue());
               System.out.println("Displays naviagtionbar node name (child node)..................................."+nl.item(0).getChildNodes().item(1).getNodeName());
               System.out.println("Displays naviagtionbar node Value: (child node)"+nl.item(0).getChildNodes().item(1).getAttributes().item(0).getNodeValue());
               System.out.println("Displays tabbar node name (child node)..................................."+nl.item(0).getChildNodes().item(3).getNodeName());
               System.out.println("Displays tabbar node Value (child node)..................................."+nl.item(0).getChildNodes().item(3).getNodeValue());
               System.out.println("Displays tabbaritem node name (child node of tab-bar)..................................."+nl.item(0).getChildNodes().item(3).getChildNodes().item(1).getNodeName());
               System.out.println("Displays tabbaritem node Value (child node of tab-bar)..................................."+nl.item(0).getChildNodes().item(3).getChildNodes().item(1).getAttributes().item(0).getNodeValue());
                if (nl.getLength() > 0) {
                    Node node = nl.item(0);
                   Node node1= node.getChildNodes().item(0);

              /*  NamedNodeMap responseCode1 = node1.getAttributes();
               Node ex= responseCode1.getNamedItem("title");*/
               System.out.println("data displaying.............................."+node.getNodeValue());
            }

   }
        } catch (DOMException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}
}
Sign up to request clarification or add additional context in comments.

2 Comments

thanks for proper guidence,but school is root node and screen,navbar,tabbar are child nodes how I can parse it because it is not working..
Because you copy-pasted the answer, which is not "properly guided"! Take my advice, read about parsing a DOM in Java (google that!), you'll at least understand what you're doing

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.