android xmlpullparser 获取属性相同的值

android xmlpullparser get attribute same value

我不知道为什么我不能 post 代码。
这是 xml 文件

<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;
    }
}

这是结果

所以。我会得到 img 的所有名称,如图像 I post.
我只想在列表视图中获取 jame、natalie 和 phil。
可能是组属性相同的值中的一个。不知道怎么形容。
xmlpullparser 可以做到吗?以及如何做到这一点?
感谢阅读。

更新 .
这是我跟随 Bhargav
的结果 这是对的。但并不完美。

我想要的列表视图是
詹姆
娜塔莉
菲尔

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 变量的最后一个属性值。
  • 如果您刚刚解析的 deoes 的 attr 不等于您持有的 lastAttr,则将其传递给 n_e.setName 方法并更新 lastAttr 变量,上面的代码片段和注释。
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 的 equals() 方法,还有另一个更漂亮的解决方案。你可以用一个集合(Set)来代替你的ArrayList。 Set 会自动检查添加的对象是否唯一(使用重写的 equals() 方法),因此您唯一要做的就是将 Set 复制到 ArrayList (new ArrayList.addAll(set)).