2016-02-23 5 views
0

Я не знаю, почему я не могу отправить код.
это XML-файлandroid xmlpullparser получить атрибут одинаковое значение

<employees> 
<detail> 
    <img name="jame">jame_1</img> 
    <img name="jame">jame_2</img> 
    <img name="jame">jame_3</img> 
    <img name="natalie">natalie_1</img> 
    <img name="natalie">natalie_2</img> 
    <img name="phil">phil_1</img> 
    <img name="phil">phil_2</img> 
    <img name="phil">phil_3</img> 
    <img name="phil">phil_4</img> 
</detail> 

это xmlpullparser, чтобы получить имя IMG

public class trangaXmlpullparser { 
    List<name_emp> name_empList; 
    private name_emp n_e; 
    private String text; 

    public trangaXmlpullparser() { 
     name_empList = new ArrayList<name_emp>(); 
    } 

    public List<name_emp> getName_empList() { 
     return name_empList; 
    } 

    public List<name_emp> parse(InputStream is) { 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 
      parser.setInput(is, null); 
      int eventType = parser.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
        case XmlPullParser.START_TAG: 
         String attr = parser.getAttributeValue(null, "name"); 
         if (tagname.equalsIgnoreCase("img")) { 
          n_e = new name_emp(); 
          n_e.setName(attr); 
         } 
         break; 
        case XmlPullParser.TEXT: 
         text = parser.getText(); 
         break; 
        case XmlPullParser.END_TAG: 
         if (tagname.equalsIgnoreCase("img")) { 
          name_empList.add(n_e); 
         } 
         break; 
        default: 
         break; 
       } 
       eventType = parser.next(); 
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return name_empList; 
    } 
} 

это результат

enter image description here

так. Я получу все имя img, как изображение, которое я отправляю.
Я просто хочу получить jame, natalie, phil в listview.
может быть атрибутом группы с одинаковым значением в одном. Я не знаю, как это описать.
может xmlpullparser сделать это? и как это сделать?
спасибо, что посмотрели.

обновление.
Это результат Я следую Bhargav
Это право. но не идеально.

enter image description here

Я хочу ListView является
JaME
наталья
фил

+0

Чтобы отправить код, вам необходимо отступать весь код с atleast 4 места – Bhargav

+0

вы можете исправить код для меня? – abcd1234

+0

Да, введите код здесь. Ill предлагаю редактировать, я не могу открыть эти изображения в своем офисе, к сожалению, они заблокированы – Bhargav

ответ

0
public class trangaXmlpullparser { 
    List<name_emp> name_empList; 
    private name_emp n_e; 
    private String text; 

    public trangaXmlpullparser() { 
     name_empList = new ArrayList<name_emp>(); 
    } 

    public List<name_emp> getName_empList() { 
     return name_empList; 
    } 

    public List<name_emp> parse(InputStream is) { 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 
      parser.setInput(is, null); 
      int eventType = parser.getEventType(); 
      String lastAttr = ""; // Initialize a string variable to hold the last attr you passed to setName. 
      String attr = ""; 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
        case XmlPullParser.START_TAG: 
         attr = parser.getAttributeValue(null, "name"); 
         if (tagname.equalsIgnoreCase("img")) { 
          n_e = new name_emp(); 
          if(!attr.equals(lastAttr)) { // check if the attr you just parsed now is equal to the last unique attr you parsed 
           n_e.setName(attr); // if its not equal that means this attr is not a duplicate and you can set the name 
           lastAttr = attr; // update the last attr variable to hold the last attr you just assigned to n_e. 
          } 
         } 
         break; 
        case XmlPullParser.TEXT: 
         text = parser.getText(); 
         break; 
        case XmlPullParser.END_TAG: 
         if (tagname.equalsIgnoreCase("img") && !attr.equals(lastAttr)) { 
          name_empList.add(n_e); 
         } 
         break; 
        default: 
         break; 
       } 
       eventType = parser.next(); 
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return name_empList; 
    } 
} 

Что я могу предложить для вашего требования это,

  • Удерживайте переменную с именем lastAttr, которая содержит последнее значение атрибута, которое вы передали только переменной n_e.
  • Если ваш attr, который вы только что разобрали, не равен lastAttr, который вы держите, затем передайте его методу n_e.setName и обновите переменную lastAttr, фрагмент кода выше вместе с комментариями.
+0

Я следую за тобой. но результат не так, как я хочу. Я обновляю результат в своем сообщении. пожалуйста, исправьте. большое спасибо – abcd1234

+0

извините, что не знаю, как загрузить изображение в комментарий – abcd1234

+0

, пожалуйста, помогите мне еще раз – abcd1234

0
public class trangaXmlpullparser { 
    List<name_emp> name_empList; 
    ArrayList<String> a = new Arraylist<>(); // Initialising new list 
    boolean isDublicate = false; // and flag 
    private name_emp n_e; 
    private String text; 

    public trangaXmlpullparser() { 
     name_empList = new ArrayList<name_emp>(); 
    } 

    public List<name_emp> getName_empList() { 
     return name_empList; 
    } 

    public List<name_emp> parse(InputStream is) { 
     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 
      parser.setInput(is, null); 
      int eventType = parser.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
        case XmlPullParser.START_TAG: 
         String attr = parser.getAttributeValue(null, "name"); 
         if (tagname.equalsIgnoreCase("img")) { 
          if (!a.contains(attr)) { // Checking if our list of strings contains attribute 
           a.add(attr); // We add new attribute in our list of strings 
           n_e = new name_emp(); 
           n_e.setName(attr); 
          } else { 
           isDublicate = true; // if attribute repeats, the flag becomes true 
          } 
         } 
         break; 
        case XmlPullParser.TEXT: 
         text = parser.getText(); 
         break; 
        case XmlPullParser.END_TAG: 
         if (tagname.equalsIgnoreCase("img")) { 
          if (!isDublicate) // Checking flag 
           name_empList.add(n_e); // If flag is false we add new element 
          else 
           isDublicate = false; // else we set flag to its default value 
         } 
         break; 
        default: 
         break; 
       } 
       eventType = parser.next(); 
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return name_empList; 
    } 
} 

Существует еще один более красивое решение, если вы понимаете, равных() метод вашего name_emp. Вы можете заменить ArrayList набором (Set). Установить автоматически проверяет, является ли добавленный объект уникальным (используя метод overrideen equals()), поэтому вам нужно только скопировать Set в ArrayList (новый ArrayList.addAll (set)).

+0

Спасибо. Но я просто отмечаю один ответ. Прошу прощения за это. – abcd1234