1. Download our Official Android App: Forums for Android!

Apps RSS reader showing html tags in feed feed text

Discussion in 'Android Development' started by cr5315, Mar 15, 2011.

  1. cr5315

    cr5315 Android Enthusiast
    Thread Starter
    Rank:
    None
    Points:
    68
    Posts:
    434
    Joined:
    Jul 23, 2010

    Jul 23, 2010
    434
    158
    68
    Narnia
    I have an RSS reader app that I'm working on and it's working fine except for the fact that when a user would click on the name of an article to see more about it, it has html tags in the text. For example, if a user clicks on the story "PJ Larsen Finishes 8th an Indianapolis Supercross", the following activity will say, "<p>JDR/J-STAR/KJM rider PJ Larsen earned eighth overall in the... in the Super class. </p>". The same thing happens it the article would have an image. The app shows "<img src="http://example.com/image.jpg">. I've looked at a lot of example on RSS readers and I can't figure out how to either get my reader to use the tags or omit them from the text.

    AndroidRssReader.java
    Code (Text):
    1. import java.io.IOException;
    2. import java.net.MalformedURLException;
    3. import java.net.URL;
    4. import java.util.List;
    5.  
    6. import javax.xml.parsers.ParserConfigurationException;
    7. import javax.xml.parsers.SAXParser;
    8. import javax.xml.parsers.SAXParserFactory;
    9.  
    10. import org.xml.sax.InputSource;
    11. import org.xml.sax.SAXException;
    12. import org.xml.sax.XMLReader;
    13.  
    14. import android.app.ListActivity;
    15. import android.content.Context;
    16. import android.content.Intent;
    17. import android.os.Bundle;
    18. import android.view.LayoutInflater;
    19. import android.view.Menu;
    20. import android.view.MenuInflater;
    21. import android.view.MenuItem;
    22. import android.view.View;
    23. import android.view.ViewGroup;
    24. import android.widget.ArrayAdapter;
    25. import android.widget.Button;
    26. import android.widget.ListView;
    27. import android.widget.TextView;
    28.  
    29. public class AndroidRssReader extends ListActivity {
    30.  
    31. private RSSFeed myRssFeed = null;
    32.  
    33. public class MyCustomAdapter extends ArrayAdapter<RSSItem> {
    34.  
    35.  public MyCustomAdapter(Context context, int textViewResourceId,
    36.    List<RSSItem> list) {
    37.   super(context, textViewResourceId, list);
    38.  }
    39.  
    40.  @Override
    41.  public View getView(int position, View convertView, ViewGroup parent) {
    42.   // TODO Auto-generated method stub
    43.   //return super.getView(position, convertView, parent);
    44.  
    45.   View row = convertView;
    46.  
    47.   if(row==null){
    48.    LayoutInflater inflater=getLayoutInflater();
    49.    row=inflater.inflate(R.layout.row, parent, false);
    50.   }
    51.  
    52.   TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
    53.   listTitle.setText(myRssFeed.getList().get(position).getTitle());
    54.   TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
    55.   listPubdate.setText(myRssFeed.getList().get(position).getPubdate());
    56.  
    57.   if (position%2 == 0){
    58.    listTitle.setBackgroundColor(0xff101010);
    59.    listPubdate.setBackgroundColor(0xff101010);
    60.   }
    61.   else{
    62.    listTitle.setBackgroundColor(0xff080808);
    63.    listPubdate.setBackgroundColor(0xff080808);
    64.   }
    65.  
    66.   return row;
    67.  }
    68. }
    69.  
    70.   /** Called when the activity is first created. */
    71.   @Override
    72.   public void onCreate(Bundle savedInstanceState) {
    73.       super.onCreate(savedInstanceState);
    74.       setContentView(R.layout.main);
    75.      
    76.       Button raceButton = (Button) findViewById(R.id.race_button);
    77.       raceButton.setOnClickListener(new View.OnClickListener() {
    78.        
    79.         @Override
    80.         public void onClick(View v) {
    81.             // TODO Auto-generated method stub
    82.             Intent raceIntent = new Intent(AndroidRssReader.this, raceActivity.class);
    83.             startActivity(raceIntent);
    84.         }
    85.     });
    86.    
    87.       try {
    88.   URL rssUrl = new URL("http://www.supercross.com/index.php?option=com_ninjarsssyndicator&feed_id=2&format=raw");
    89.   SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
    90.   SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
    91.   XMLReader myXMLReader = mySAXParser.getXMLReader();
    92.   RSSHandler myRSSHandler = new RSSHandler();
    93.   myXMLReader.setContentHandler(myRSSHandler);
    94.   InputSource myInputSource = new InputSource(rssUrl.openStream());
    95.   myXMLReader.parse(myInputSource);
    96.  
    97.   myRssFeed = myRSSHandler.getFeed();
    98.  
    99.  } catch (MalformedURLException e) {
    100.   // TODO Auto-generated catch block
    101.   e.printStackTrace();
    102.  } catch (ParserConfigurationException e) {
    103.   // TODO Auto-generated catch block
    104.   e.printStackTrace();
    105.  } catch (SAXException e) {
    106.   // TODO Auto-generated catch block
    107.   e.printStackTrace();
    108.  } catch (IOException e) {
    109.   // TODO Auto-generated catch block
    110.   e.printStackTrace();
    111.  }
    112.  
    113.  if (myRssFeed!=null)
    114.  {
    115.   TextView feedDescribtion = (TextView)findViewById(R.id.feeddescribtion);
    116.   feedDescribtion.setText(myRssFeed.getDescription());
    117.  
    118.   MyCustomAdapter adapter =
    119.    new MyCustomAdapter(this, R.layout.row, myRssFeed.getList());
    120.   setListAdapter(adapter);
    121.  }
    122.  
    123.  }
    124.  
    125.  @Override
    126.  protected void onListItemClick(ListView l, View v, final int position, long id) {
    127.   // TODO Auto-generated method stub
    128.      Intent intent = new Intent(AndroidRssReader.this, ShowDetails.class);
    129.        Bundle bundle = new Bundle();
    130.        bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle());
    131.        bundle.putString("keyDescription", myRssFeed.getItem(position).getDescription());
    132.        bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
    133.        bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate());
    134.        intent.putExtras(bundle);
    135.             startActivity(intent);
    136.          
    137.       };
    138.  
    139.  
    140.  
    141.  
    142.  
    143. @Override
    144. public boolean onCreateOptionsMenu(Menu menu) {
    145.     MenuInflater inflater = getMenuInflater();
    146.     inflater.inflate(R.menu.menu, menu);
    147.     return true;
    148. }
    149.  
    150. @Override
    151. public boolean onOptionsItemSelected(MenuItem item) {
    152.     // Handle item selection
    153.     switch (item.getItemId()) {
    154.     case R.id.settings:
    155.         Intent settings = new Intent (this,settingsActivity.class);
    156.         startActivity(settings);
    157.     case R.id.about:
    158.         Intent about = new Intent (this, aboutActivity.class);
    159.         startActivity(about);
    160.     case R.id.exit:
    161.         finish();
    162.         return true;
    163.     default:
    164.         return super.onOptionsItemSelected(item);
    165.     }
    166. }
    167. }
    ShowDetails.java
    Code (Text):
    1. package com.bba.supercross;
    2.  
    3. import android.app.Activity;
    4. import android.os.Bundle;
    5. import android.widget.TextView;
    6.  
    7. public class ShowDetails extends Activity {
    8.  
    9. @Override
    10. protected void onCreate(Bundle savedInstanceState) {
    11.  // TODO Auto-generated method stub
    12.  super.onCreate(savedInstanceState);
    13.  setContentView(R.layout.details);
    14.  TextView detailsTitle = (TextView)findViewById(R.id.detailstitle);
    15.  TextView detailsDescription = (TextView)findViewById(R.id.detailsdescription);
    16.  TextView detailsPubdate = (TextView)findViewById(R.id.detailspubdate);
    17.  TextView detailsLink = (TextView)findViewById(R.id.detailslink);
    18.  
    19.  Bundle bundle = this.getIntent().getExtras();
    20.    
    21.       detailsTitle.setText(bundle.getString("keyTitle"));
    22.       detailsDescription.setText(bundle.getString("keyDescription"));
    23.       detailsPubdate.setText(bundle.getString("keyPubdate"));
    24.       detailsLink.setText(bundle.getString("keyLink"));
    25.    
    26. }
    27. }
    There are more .java's dealing with the RSS reader. If you think they would help, let me know and I will post them.

    Here is an example of what it looks like

    [​IMG]
     

    Advertisement

  2. robfnt

    robfnt Lurker
    Rank:
    None
    Points:
    5
    Posts:
    1
    Joined:
    Mar 15, 2011

    Mar 15, 2011
    1
    0
    5
    The deescription field is often HTML and you need to convert it to plain text.
    A simple solution is to use a regular expression:

    String nohtml = htmlDescription.replaceAll("\\<.*?>","");

    You will also find the need to unescape special charactes, such as &amp; to &

    I wrote this simple code:

    Code (Text):
    1.  
    2.     public static String decodeXML(String in)
    3.     {
    4.         if (in==null) return null;
    5.         StringBuilder out = new StringBuilder();
    6.         int i = 0;
    7.  
    8.         try
    9.         {
    10.             for(i = 0; i < in.length(); i++)
    11.             {
    12.                 char c = in.charAt(i);
    13.                 if(c == '&')
    14.                 {
    15.                     i++;
    16.                     if(in.startsWith("amp;", i))        {out.append('&');  i += 3;}
    17.                     else if (in.startsWith("lt;", i))   {out.append('<');  i += 2;}
    18.                     else if (in.startsWith("gt;", i))   {out.append('>');  i += 2;}
    19.                     else if (in.startsWith("apos;", i)) {out.append('\''); i += 4;}
    20.                     else if (in.startsWith("quot;", i)) {out.append('"');  i += 4;}
    21.                     else if (in.startsWith("rarr;", i)) {out.append('\u2192');  i += 4;}
    22.                     else if (in.startsWith("larr;", i)) {out.append('\u2190');  i += 4;}
    23.                     else if (in.startsWith("lsquo;", i)) {out.append('\u2018');  i += 5;}
    24.                     else if (in.startsWith("rsquo;", i)) {out.append('\u2019');  i += 5;}
    25.                     else if (in.startsWith("mdash;", i)) {out.append('-');  i += 5;}
    26.                    
    27.                     else if (in.startsWith("#038;", i)) {out.append('&');  i += 4;}
    28.                     else if (in.startsWith("#38;", i)) {out.append('&');  i += 3;}
    29.                     else if (in.startsWith("#039;", i)) {out.append('\'');  i += 4;}
    30.                     else if (in.startsWith("#39;", i)) {out.append('\'');  i += 3;}
    31.                    
    32.                     else if (in.startsWith("#034;", i)) {out.append('"');  i += 4;}
    33.                     else if (in.startsWith("#34;", i)) {out.append('"');  i += 3;}
    34.                     else if (in.startsWith("#060;", i)) {out.append('<');  i += 4;}
    35.                     else if (in.startsWith("#062;", i)) {out.append('>');  i += 4;}
    36.                    
    37.                     else if (in.startsWith("#047", i)) {out.append('/');  i += 3;}
    38.                     else if (in.startsWith("#47", i)) {out.append('/');  i += 2;}
    39.                     else if (in.startsWith("#47;", i)) {out.append('/');  i += 3;}
    40.                    
    41.                     else if (in.startsWith("#8216;", i)) {out.append('\u2018');  i += 5;}
    42.                     else if (in.startsWith("#8217;", i)) {out.append('\u2019');  i += 5;}
    43.                     else if (in.startsWith("#8220;", i)) {out.append('\u201c');  i += 5;}                    
    44.                     else if (in.startsWith("#8211;", i)) {out.append('\u201c');  i += 5;}                    
    45.                     else if (in.startsWith("#8221;", i)) {out.append('\u201d');  i += 5;}
    46.                     else if (in.startsWith("#8230;", i)) {out.append('\u2026');  i += 5;}
    47.                     else if (in.startsWith("#0146;", i)) {out.append('\u0092');  i += 5;}
    48.                     else if (in.startsWith("#x2014;", i)) {out.append('\u2014');  i += 6;}
    49.                     //http://htmlhelp.com/reference/html40/entities/special.html
    50.                    
    51.                     else {out.append('&'); i--;}
    52.                 }
    53.                 else if(c == '\\')
    54.                 {
    55.                     i++;
    56.                     if(in.charAt(i) == 'u')
    57.                     {
    58.                         i++;
    59.                         out.append((char)Integer.parseInt(in.substring(i,i+4),16));
    60.                          i += 3;
    61.                     }
    62.                     else if(in.charAt(i) == '\\')
    63.                          out.append('\\');
    64.                     else
    65.                     {
    66.                         out.append('\\');
    67.                         i--; // unread the last char
    68.                     }
    69.                 }
    70.                 else
    71.                     out.append(c);
    72.             }
    73.         }
    74.         catch (Exception e)
    75.         {
    76.             return in;
    77.         }
    78.  
    79.         return out.toString();
    80.     }
    81.  
    We use this technique in the RSS Reader Task of the BuzzBox SDK for Android. Check out this:
    BuzzBox SDK Library - Demo App




    That should work unless the html is badly malformed. It that case and in more complecated cases you need to use a html parser. I used a modified version HtmlCleaner on Android and then I wrote some simple code to extract the text.
    I can share if you need it.
     
  3. cr5315

    cr5315 Android Enthusiast
    Thread Starter
    Rank:
    None
    Points:
    68
    Posts:
    434
    Joined:
    Jul 23, 2010

    Jul 23, 2010
    434
    158
    68
    Narnia
    I put it in the app, but it doesn't seem to be working. Am I doing something wrong?

    Code (Text):
    1.  
    2. package com.bba.supercross;
    3.  
    4. import java.io.IOException;
    5. import java.net.MalformedURLException;
    6. import java.net.URL;
    7. import java.util.List;
    8.  
    9. import javax.xml.parsers.ParserConfigurationException;
    10. import javax.xml.parsers.SAXParser;
    11. import javax.xml.parsers.SAXParserFactory;
    12.  
    13. import org.xml.sax.InputSource;
    14. import org.xml.sax.SAXException;
    15. import org.xml.sax.XMLReader;
    16.  
    17. import android.app.ListActivity;
    18. import android.content.Context;
    19. import android.content.Intent;
    20. import android.os.Bundle;
    21. import android.view.LayoutInflater;
    22. import android.view.Menu;
    23. import android.view.MenuInflater;
    24. import android.view.MenuItem;
    25. import android.view.View;
    26. import android.view.ViewGroup;
    27. import android.widget.ArrayAdapter;
    28. import android.widget.Button;
    29. import android.widget.ListView;
    30. import android.widget.TextView;
    31.  
    32. public class AndroidRssReader extends ListActivity {
    33.  
    34. private RSSFeed myRssFeed = null;
    35.  
    36. public class MyCustomAdapter extends ArrayAdapter<RSSItem> {
    37.  
    38.  public MyCustomAdapter(Context context, int textViewResourceId,
    39.    List<RSSItem> list) {
    40.   super(context, textViewResourceId, list);
    41.  }
    42.  
    43.  public String decodeXML(String in)
    44.  {
    45.      if (in==null) return null;
    46.      StringBuilder out = new StringBuilder();
    47.      int i = 0;
    48.  
    49.      try
    50.      {
    51.          for(i = 0; i < in.length(); i++)
    52.          {
    53.              char c = in.charAt(i);
    54.              if(c == '&')
    55.              {
    56.                  i++;
    57.                  if(in.startsWith("amp;", i))        {out.append('&');  i += 3;}
    58.                  else if (in.startsWith("lt;", i))   {out.append('<');  i += 2;}
    59.                  else if (in.startsWith("gt;", i))   {out.append('>');  i += 2;}
    60.                  else if (in.startsWith("apos;", i)) {out.append('\''); i += 4;}
    61.                  else if (in.startsWith("quot;", i)) {out.append('"');  i += 4;}
    62.                  else if (in.startsWith("rarr;", i)) {out.append('\u2192');  i += 4;}
    63.                  else if (in.startsWith("larr;", i)) {out.append('\u2190');  i += 4;}
    64.                  else if (in.startsWith("lsquo;", i)) {out.append('\u2018');  i += 5;}
    65.                  else if (in.startsWith("rsquo;", i)) {out.append('\u2019');  i += 5;}
    66.                  else if (in.startsWith("mdash;", i)) {out.append('-');  i += 5;}
    67.                  
    68.                  else if (in.startsWith("#038;", i)) {out.append('&');  i += 4;}
    69.                  else if (in.startsWith("#38;", i)) {out.append('&');  i += 3;}
    70.                  else if (in.startsWith("#039;", i)) {out.append('\'');  i += 4;}
    71.                  else if (in.startsWith("#39;", i)) {out.append('\'');  i += 3;}
    72.                  
    73.                  else if (in.startsWith("#034;", i)) {out.append('"');  i += 4;}
    74.                  else if (in.startsWith("#34;", i)) {out.append('"');  i += 3;}
    75.                  else if (in.startsWith("#060;", i)) {out.append('<');  i += 4;}
    76.                  else if (in.startsWith("#062;", i)) {out.append('>');  i += 4;}
    77.                  
    78.                  else if (in.startsWith("#047", i)) {out.append('/');  i += 3;}
    79.                  else if (in.startsWith("#47", i)) {out.append('/');  i += 2;}
    80.                  else if (in.startsWith("#47;", i)) {out.append('/');  i += 3;}
    81.                  
    82.                  else if (in.startsWith("#8216;", i)) {out.append('\u2018');  i += 5;}
    83.                  else if (in.startsWith("#8217;", i)) {out.append('\u2019');  i += 5;}
    84.                  else if (in.startsWith("#8220;", i)) {out.append('\u201c');  i += 5;}                    
    85.                  else if (in.startsWith("#8211;", i)) {out.append('\u201c');  i += 5;}                    
    86.                  else if (in.startsWith("#8221;", i)) {out.append('\u201d');  i += 5;}
    87.                  else if (in.startsWith("#8230;", i)) {out.append('\u2026');  i += 5;}
    88.                  else if (in.startsWith("#0146;", i)) {out.append('\u0092');  i += 5;}
    89.                  else if (in.startsWith("#x2014;", i)) {out.append('\u2014');  i += 6;}
    90.                  //http://htmlhelp.com/reference/html40/entities/special.html
    91.                  
    92.                  else {out.append('&'); i--;}
    93.              }
    94.              else if(c == '\\')
    95.              {
    96.                  i++;
    97.                  if(in.charAt(i) == 'u')
    98.                  {
    99.                      i++;
    100.                      out.append((char)Integer.parseInt(in.substring(i,i+4),16));
    101.                       i += 3;
    102.                  }
    103.                  else if(in.charAt(i) == '\\')
    104.                       out.append('\\');
    105.                  else
    106.                  {
    107.                      out.append('\\');
    108.                      i--; // unread the last char
    109.                  }
    110.              }
    111.              else
    112.                  out.append(c);
    113.          }
    114.      }
    115.      catch (Exception e)
    116.      {
    117.          return in;
    118.      }
    119.  
    120.      return out.toString();
    121.  }
    122.  
    123.  @Override
    124.  public View getView(int position, View convertView, ViewGroup parent) {
    125.   // TODO Auto-generated method stub
    126.   //return super.getView(position, convertView, parent);
    127.  
    128.   View row = convertView;
    129.  
    130.   if(row==null){
    131.    LayoutInflater inflater=getLayoutInflater();
    132.    row=inflater.inflate(R.layout.row, parent, false);
    133.   }
    134.  
    135.   TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
    136.   listTitle.setText(myRssFeed.getList().get(position).getTitle());
    137.   TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
    138.   listPubdate.setText(myRssFeed.getList().get(position).getPubdate());
    139.  
    140.   if (position%2 == 0){
    141.    listTitle.setBackgroundColor(0xff101010);
    142.    listPubdate.setBackgroundColor(0xff101010);
    143.   }
    144.   else{
    145.    listTitle.setBackgroundColor(0xff080808);
    146.    listPubdate.setBackgroundColor(0xff080808);
    147.   }
    148.  
    149.   return row;
    150.  }
    151. }
    152.  
    153.   /** Called when the activity is first created. */
    154.   @Override
    155.   public void onCreate(Bundle savedInstanceState) {
    156.       super.onCreate(savedInstanceState);
    157.       setContentView(R.layout.main);
    158.      
    159.       Button raceButton = (Button) findViewById(R.id.race_button);
    160.       raceButton.setOnClickListener(new View.OnClickListener() {
    161.        
    162.         @Override
    163.         public void onClick(View v) {
    164.             // TODO Auto-generated method stub
    165.             Intent raceIntent = new Intent(AndroidRssReader.this, raceActivity.class);
    166.             startActivity(raceIntent);
    167.         }
    168.     });
    169.    
    170.       try {
    171.   URL rssUrl = new URL("http://www.supercross.com/index.php?option=com_ninjarsssyndicator&feed_id=2&format=raw");
    172.   SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
    173.   SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
    174.   XMLReader myXMLReader = mySAXParser.getXMLReader();
    175.   RSSHandler myRSSHandler = new RSSHandler();
    176.   myXMLReader.setContentHandler(myRSSHandler);
    177.   InputSource myInputSource = new InputSource(rssUrl.openStream());
    178.   myXMLReader.parse(myInputSource);
    179.  
    180.   myRssFeed = myRSSHandler.getFeed();
    181.  
    182.  } catch (MalformedURLException e) {
    183.   // TODO Auto-generated catch block
    184.   e.printStackTrace();
    185.  } catch (ParserConfigurationException e) {
    186.   // TODO Auto-generated catch block
    187.   e.printStackTrace();
    188.  } catch (SAXException e) {
    189.   // TODO Auto-generated catch block
    190.   e.printStackTrace();
    191.  } catch (IOException e) {
    192.   // TODO Auto-generated catch block
    193.   e.printStackTrace();
    194.  }
    195.  
    196.  if (myRssFeed!=null)
    197.  {
    198.   TextView feedDescribtion = (TextView)findViewById(R.id.feeddescribtion);
    199.   feedDescribtion.setText(myRssFeed.getDescription());
    200.  
    201.   MyCustomAdapter adapter =
    202.    new MyCustomAdapter(this, R.layout.row, myRssFeed.getList());
    203.   setListAdapter(adapter);
    204.  }
    205.  
    206.  }
    207.  
    208.  @Override
    209.  protected void onListItemClick(ListView l, View v, final int position, long id) {
    210.   // TODO Auto-generated method stub
    211.      Intent intent = new Intent(AndroidRssReader.this, ShowDetails.class);
    212.        Bundle bundle = new Bundle();
    213.        bundle.putString("keyTitle", myRssFeed.getItem(position).getTitle());
    214.        bundle.putString("keyDescription", myRssFeed.getItem(position).getDescription());
    215.        bundle.putString("keyLink", myRssFeed.getItem(position).getLink());
    216.        bundle.putString("keyPubdate", myRssFeed.getItem(position).getPubdate());
    217.        intent.putExtras(bundle);
    218.             startActivity(intent);
    219.          
    220.       };
    221.  
    222.  
    223.  
    224.  
    225.  
    226. @Override
    227. public boolean onCreateOptionsMenu(Menu menu) {
    228.     MenuInflater inflater = getMenuInflater();
    229.     inflater.inflate(R.menu.menu, menu);
    230.     return true;
    231. }
    232.  
    233. @Override
    234. public boolean onOptionsItemSelected(MenuItem item) {
    235.     // Handle item selection
    236.     switch (item.getItemId()) {
    237.     case R.id.about:
    238.         Intent about = new Intent (this, aboutActivity.class);
    239.         startActivity(about);
    240.     case R.id.exit:
    241.         finish();
    242.         return true;
    243.     default:
    244.         return super.onOptionsItemSelected(item);
    245.     }
    246. }
    247. }
    248.  
     
  4. cr5315

    cr5315 Android Enthusiast
    Thread Starter
    Rank:
    None
    Points:
    68
    Posts:
    434
    Joined:
    Jul 23, 2010

    Jul 23, 2010
    434
    158
    68
    Narnia
    I also put the code in the ShowDetails.java but it's still showing the html tags.
     

Share This Page

Loading...