解析包含多个属性的XML

时间:2012-03-20 11:18:27

标签: android xml parsing xml-parsing

我正在使用SAX解析器解析一个大的XML文档,但在看到Google上的SAX解析示例后,我无法解析这个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>

这不是完整的XML文档。为了解析它,我创建了5个属性类:

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;
}

我覆盖了startElement方法,在这种方法中我无法应用精确编码 -

@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"));
    }
}

parseProperty方法是:

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;
}

如何通过我应用的上述规则解析上述XML?

1 个答案:

答案 0 :(得分:0)

您好请尝试使用此代码,您需要使用正确的标签位置。希望此代码可以使用

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");
            }

请找到以下代码我解析了readxml函数中的几乎所有子节点和属性值,因为我没有xml的链接我使用assets文件夹来读取该xml文件。在sop语句中可以找到如何从中获取值子节点以及属性

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();
        }
}
}