2016-02-03 101 views
0

我想解析XML:http://www.sjc.com.vn/xml/tygiavang.xml 我想要得到的產品:買=「32.800」賣=「33.070」 TYPE =「萬榮SJC 1L」和更新的時間Android的SAXParser的簡單框架

我使用簡單的框架來解析,但我不能得到我想要的元素。 這裏是我的課: ratelist.java

@Root(name = "ratelist", strict = false) 
public class Ratelist{ 
    @Attribute 
    private String updated; 

    @Element 
    private String city; 

    public String getUpdated(){ 
     return updated; 
    } 
    public String getCity(){ 
     return city; 
    } 

} 

city.java

@Root(name = "city", strict = false) 
public class City { 
    @Attribute 
    private String name; 

    @Element 
    private String item; 

    public String getName(){ 
     return name; 
    } 
    public String getItem(){ 
     return item; 
    } 

} 

item.java

@Root(name = "item", strict = false) 
public class Item { 
    @Attribute 
    private String buy; 

    @Attribute 
    private String sell; 

    @Attribute 
    private String type; 

    public String getBuy(){ 
     return buy; 
    } 
    public String getSell(){ 
     return sell; 
    } 
    public String getType(){ 
     return type; 
    } 
} 

Roo_class.java

@Root 
public class Root_class { 
    @Element 
    private String title; 

    @Element 
    private String url; 

    @Element 
    private Ratelist ratelist; 

    public String getTitle(){ 
     return title; 
    } 

    public String getUrl(){ 
     return url; 
    } 

    public Ratelist getRatelist(){ 
     return ratelist; 
    } 

} 

和主.J AVA

public class main extends Fragment { 
    ListView listView; 
    String path = "http://www.sjc.com.vn/xml/tygiavang.xml"; 
    MyAsyncTask myAsyncTask; 
    SwipeRefreshLayout swipeRefreshLayout; 
    ProgressDialog progressDialog; 
    ArrayList<HashMap<String, String>> data_listview = new ArrayList<HashMap<String, String>>(); 
    String ngay; 
    String mua = ""; 
    String ban = ""; 
    String loai = ""; 
    TextView tv_ban, tv_mua, tv_loai, tv_ngay; 
    Item item; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_city_gold, container, false); 
     listView = (ListView) view.findViewById(R.id.listView); 
     tv_ban = (TextView) view.findViewById(R.id.textView2); 
     tv_mua = (TextView) view.findViewById(R.id.textView3); 
     tv_loai = (TextView) view.findViewById(R.id.textView4); 
     tv_ngay = (TextView) view.findViewById(R.id.textView13); 
     swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_container); 

     tv_ban.setText(R.string.sell); 
     tv_mua.setText(R.string.buy); 
     tv_loai.setText(R.string.type); 

     if (isNetworkConnected()==true) { 
      myAsyncTask = new MyAsyncTask(); 
      myAsyncTask.execute(); 
     }else { 
      Toast.makeText(getActivity(), R.string.requirenetwork, Toast.LENGTH_SHORT).show(); 
     } 
     swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       new CountDownTimer(1000, 500) { 
        @Override 
        public void onTick(long millisUntilFinished) { 
         if (isNetworkConnected() == true) { 
          myAsyncTask = new MyAsyncTask(); 
          myAsyncTask.execute(); 
         } 
        } 

        @Override 
        public void onFinish() { 
         swipeRefreshLayout.setRefreshing(false); 
         if (isNetworkConnected() == false) { 
          snackbar(); 
         } 
        } 
       }.start(); 

      } 
     }); 
     return view; 
    } 

    class MyAsyncTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      data_listview.clear(); 
      progressDialog = ProgressDialog.show(getContext(), getActivity().getResources().getString(R.string.updating), getActivity().getResources().getString(R.string.wait)); 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 
      try { 
       URL url = new URL(path); 
       URLConnection connection = url.openConnection(); 
       InputStream is = connection.getInputStream(); 
       Serializer serializer = new Persister(); 
       Ratelist data = serializer.read(Ratelist.class, is); 


        ban = item.getSell() + "\n"; 
        mua = item.getBuy() + "\n"; 
        loai = item.getType() + "\n"; 
        // 
        HashMap<String, String> hashmap = new HashMap<String, String>(); 
        hashmap.put("KEY_ID", ban); 
        hashmap.put("KEY_NAME", mua); 
        hashmap.put("KEY_BUY", loai); 
        data_listview.add(hashmap); 

       // ngay = data.get(); 
       /* InputStream is2 = connection.getInputStream(); 
       Serializer serializer1=new Persister(); 
       ratelist data1=serializer1.read(ratelist.class,is2); 
       for (ratelist ratelist:data1.getCity()){ 

       }*/ 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      String text = getResources().getString(R.string.update); 
      tv_ngay.setText(text + ": " + ngay); 
      ListAdapter adapter = new SimpleAdapter(getActivity(), 
        data_listview, //du lieu 
        R.layout.currency_mot_item, //lay out 
        new String[]{"KEY_ID", "KEY_NAME", "KEY_BUY"}, //from 
        new int[]{R.id.textView10, R.id.textView11, R.id.textView12}); //to 
      listView.setAdapter(adapter); 
      progressDialog.dismiss(); 
      Toast.makeText(getActivity(), ban, Toast.LENGTH_SHORT).show(); 
     } 

    } 

回答

0

要調用serializer.read(Ratelist.class, is)<ratelist>不是XML的根。

使用標題,url和ratelist元素創建另一個類Root,在調用serializer.read()時使用該元素,並且應該全部設置。

此外,您沒有正確使用註釋並通過使用列表計算重複標記。

@Root(name="root") 
public class Root { 

    @Element 
    private String title; 

    @Element 
    private String url; 

    @Element 
    private Ratelist ratelist; 

    public Ratelist getRatelist() { 
     return ratelist; 
    } 
} 


@Element(name="ratelist") 
public class Ratelist { 

    @Attribute 
    private String updated; 

    @ElementList 
    private List<City> cities; 

    public String getUpdated() { 
     return updated; 
    } 

    public List<City> getCities() { 
     return cities; 
    } 
} 


@Element(name="city") 
public class City { 

    @Attribute 
    private String name; 

    @ElementList 
    private List<Item> items; 

    public String getName() { 
     return name; 
    } 

    public List<Item> getItems() { 
     return items; 
    } 
} 


@Element(name="item") 
public class Item { 

    @Attribute 
    private String buy; 

    @Attribute 
    private String sell; 

    @Attribute 
    private String type; 

    public String getBuy() { 
     return buy; 
    } 

    public String getSell() { 
     return sell; 
    } 

    public String getType() { 
     return type; 
    } 
} 

    InputStream is2 = connection.getInputStream(); 
    Serializer serializer1 = new Persister(); 
    Root root = serializer1.read(Root.class, is2); 
    Ratelist ratelist = root.getRatelist(); 

    Log.d(TAG, "Updated: " + ratelist.getUpdated()); 

    for (City city : ratelist.getCities()) { 

     Log.d(TAG, "City: " + city.getName()); 

     for (Item item : city.getItems()) { 
      Log.d(TAG, "Buy: " + item .getBuy()); 
      Log.d(TAG, "Sell: " + item .getSell()); 
      Log.d(TAG, "Type: " + item .getType()); 
     } 
    } 
+0

謝謝你的回答。我創建了一個Root類。你可以在第一篇文章中看到它。但我不知道如何解析它們。你能告訴我正確的事 –

+0

更新我的答案。 –

+0

非常感謝拉爾森。有效 –