2012-03-20 101 views
0

我解析使用SAX解析器大的XML文檔,但看到的對谷歌SAX解析的例子之後,我無法解析這個XML:解析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方法中,我不能這樣做如何運用精確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")); 
    } 
} 

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

你似乎使用SAX解析器。看看DOM解析器,我敢打賭,你會發現更容易理解。你可以谷歌「android dom解析器」並獲取資源。 – slezica 2012-03-20 11:21:16

+0

但我可以使用xml大小很大嗎? – learner 2012-03-20 11:23:37

+0

「很大」有多大?如果「非常」確實是DOM非常大的話,我仍然會看看其他解析器。盲目編寫SAX(特別是Java)是一件偷偷摸摸,耗時的工作。如果你需要更小的內存空間,Android有一個與SAX非常相似的PULL解析器,但它有一個(在我看來)更加健壯的界面。 – slezica 2012-03-20 11:27:24

回答

0

你好,請試試這個代碼,你需要使用tags.Hope的正確位置,此代碼將工作

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的鏈接我使用的資產文件夾讀取SOP語句XML file.With可以找到如何獲取值從子節點以及屬性

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

感謝您的正確guidence ... – learner 2012-03-20 14:02:23

+0

感謝您的正確guidence,但學校是根節點和屏幕,導航欄,tabbar是子節點,我可以解析它,因爲它不工作.. – learner 2012-03-20 14:09:01

+0

因爲您複製粘貼的答案不是「正確指導」的!接受我的建議,閱讀關於解析Java中的DOM(google!),你至少會明白你在做什麼 – slezica 2012-03-20 15:32:13