Load image từ XML với SAX Parser

Ở bài này bạn sẽ học cách làm việc với XML bằng SAX Parser. Qua file XML chúng ta sẽ load 1 tấm ảnh lên màn hình Android. File xmlParsing.xml nằm trong thư mục xmlParser.
File XML sẽ có dạng như sau:

xmlParsing.xml

<index>
  <item>
      <name>my Name 1</name>
      <website category="Android">http://localhost/xmlParser/</website>
      <picname>pic1.png</picname>
  </item>
  <item>
      <name>my Name 2</name>
      <website category="Flash">http://localhost/xmlParser/</website>
      <picname>pic2.png</picname>
  </item>
</index>

Trong đó pic1.png và pic2.png sẽ là 2 tấm ảnh được lấy lên màn hình Android. Cả 2 ảnh này đều được để trong thư mục xmlParser.

Java:

Main.java

public class Main extends Activity {
   SitesList sitesList = null;
   public String myimageURL;
   public String picName;
   public ImageView loader;
   public TextView myURL_txt;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      myURL_txt = (TextView) findViewById(R.id.url_txt);
      loader = (ImageView) findViewById(R.id.loader);

      try {
         SAXParserFactory spf = SAXParserFactory.newInstance();
         SAXParser sp = spf.newSAXParser();
         XMLReader xr = sp.getXMLReader();
         URL sourceUrl = new URL(
               "http://localhost/xmlParser/xmlParsing.xml");

         // Tạo handler để xử lý XML Tags ( extends DefaultHandler )
         MyXMLHandler myXMLHandler = new MyXMLHandler();
         xr.setContentHandler(myXMLHandler);
         xr.parse(new InputSource(sourceUrl.openStream()));

      } catch (Exception e) {
         System.out.println("XML Pasing Excpetion = " + e);
      }

      // Lấy kết quả từ MyXMLHandler SitlesList Object 
      sitesList = MyXMLHandler.sitesList;

      for (int i = 0; i < sitesList.getName().size(); i++) {
         Log.d("MyTrace", "name: " + sitesList.getName().get(i));
         Log.d("MyTrace", "website: " + sitesList.getWebsite().get(i));
         Log.d("MyTrace", "category: " + sitesList.getCategory().get(i));

         myimageURL = sitesList.getWebsite().get(1);
         picName = sitesList.getpicName().get(1);
         myURL_txt.setText("link: " + myimageURL + picName);
      }
		
      downloadFile(myimageURL + picName);
      Log.d("MyTrace", "url: " + myimageURL + picName);
   }

   Bitmap bmImg;
   void downloadFile(String fileUrl) {
      URL myFileUrl = null;
      try {
         myFileUrl = new URL(fileUrl);
      } catch (MalformedURLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      try {
         HttpURLConnection conn = (HttpURLConnection) myFileUrl
               .openConnection();
         conn.setDoInput(true);
         conn.connect();
         InputStream is = conn.getInputStream();

         bmImg = BitmapFactory.decodeStream(is);
         loader.setImageBitmap(bmImg);
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
}

MyXMLHandler.java

public class MyXMLHandler extends DefaultHandler {
   Boolean currentElement = false;
   String currentValue = null;
   public static SitesList sitesList = null;

   public static SitesList getSitesList() {
      return sitesList;
   }

   public static void setSitesList(SitesList sitesList) {
      MyXMLHandler.sitesList = sitesList;
   }

   @Override
   public void startElement(String uri, String localName, String qName,
         Attributes attributes) throws SAXException {

      currentElement = true;
      if (localName.equals("index")) {
         sitesList = new SitesList();
      } else if (localName.equals("website")) {
         // Lấy giá trị attributes
         String attr = attributes.getValue("category");
         sitesList.setCategory(attr);
      }
   }

   @Override
   public void endElement(String uri, String localName, String qName)
         throws SAXException {

      currentElement = false;

      // Gắn giá trị
      if (localName.equalsIgnoreCase("name"))
         sitesList.setName(currentValue);
      else if (localName.equalsIgnoreCase("website"))
         sitesList.setWebsite(currentValue);
      else if (localName.equalsIgnoreCase("picName"))
         sitesList.setpicName(currentValue);
   }

   @Override
   public void characters(char[] ch, int start, int length)
         throws SAXException {

      if (currentElement) {
         currentValue = new String(ch, start, length);
         currentElement = false;
      }
   }
}

SitesList.java

public class SitesList {
   private ArrayList< String > name = new ArrayList< String >();
   private ArrayList< String > website = new ArrayList< String >();
   private ArrayList< String > category = new ArrayList< String >();
   private ArrayList< String > picName = new ArrayList< String >();

   public ArrayList< String > getName() {
      return name;
   }

   public void setName(String name) {
      this.name.add(name);
   }

   public ArrayList< String > getWebsite() {
      return website;
   }

   public void setWebsite(String website) {
      this.website.add(website);
   }

   public ArrayList< String > getCategory() {
      return category;
   }

   public void setCategory(String category) {
      this.category.add(category);
   }
	
   public ArrayList< String > getpicName() {
      return picName;
   }

   public void setpicName(String picName) {
      this.picName.add(picName);
   }
}

Cuối cùng bạn đừng quên gắn vào AndroidManifest.xml trong Uses Permission giá trị android.permission.INTERNET nhé.