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)).
我不知道为什么我不能 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)).