Android Studio XmlPullParser 解析多重嵌套元素
Android Studio XmlPullParser parsing multiply nested elements
我的 XML 文件是这样的:
<Items>
<Nested_item>
<id>1</id>
<name>nested</name>
<description>
<desc_item>1</desc_item>
<desc_item>2</desc_item>
<desc_item>3</desc_item>
</description>
</Nested_item>
<Nested_item>
<id>2</id>
<name>nested2</name>
<description>
<desc_item>1</desc_item>
<desc_item>2</desc_item>
<desc_item>3</desc_item>
</description>
</Nested_item>
<Nested_item>
<id>3</id>
<name>nested3</name>
<description>
<desc_item>1</desc_item>
<desc_item>2</desc_item>
<desc_item>3</desc_item>
</description>
</Nested_item>
</Items>
并且我有 class 个带有我放入 ArrayList 的属性的项目,我设法解析了除 desc_item 之外的所有属性(我需要它作为每个 Item 对象的 ArrayList)。例如,我如何告诉解析器只取第三项,并将那些 desc_item 值作为字符串?
我找到了问题的解决方案,我已经解析了内部数据,然后解析了特定数据:
private ArrayList<Proizvod> parseXML (XmlPullParser parser) throws XmlPullParserException, IOException {
ArrayList<Proizvod> proizvodLista = null;
int eventType = parser.getEventType();
Proizvod proizvod = null;
while(eventType != XmlPullParser.END_DOCUMENT){
String name;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
proizvodLista = new ArrayList<Proizvod>();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
//System.out.println(name);
if(name.equals("Proizvod")){
proizvod = new Proizvod();
proizvod.setId(parser.getAttributeValue(null, "id"));
}else if(proizvod != null){
if(name.equalsIgnoreCase("ime_proizvoda")){
proizvod.setIme_proizvoda(parser.nextText());
}else if(name.equalsIgnoreCase("vrsta_proizvoda")){
proizvod.setVrsta_proizvoda(parser.nextText());
}else if(name.equalsIgnoreCase("merna_jedinica")){
proizvod.setVrsta_proizvoda(parser.nextText());
}else if(name.equalsIgnoreCase("Prodavnice")){
proizvod.setLista_prodavnica(parsing(parser));
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if(name.equalsIgnoreCase("proizvod")&& proizvod !=null){
proizvodLista.add(proizvod);
}
}
eventType = parser.next();
}
return proizvodLista;
}
private ArrayList<String> parsing (XmlPullParser parser) throws XmlPullParserException, IOException {
String print = null;
int eventType = parser.getEventType();
ArrayList<String> lista = new ArrayList<String>();
while(eventType != XmlPullParser.END_DOCUMENT){
String name = parser.getName();
if(name.equalsIgnoreCase("Prodavnice")){break;}
else{
if(eventType==XmlPullParser.START_TAG){
print = parser.nextText();
lista.add(print);
System.out.println(print);
}
}
eventType = parser.next();
}
return lista;
}
我的 XML 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Proizvodi>
<Proizvod id="1">
<ime_proizvoda>Mleko</ime_proizvoda>
<vrsta_proizvoda>mlecni proizvod</vrsta_proizvoda>
<merna_jedinica>litar</merna_jedinica>
<Prodavnice>
<Prodavnica>1</Prodavnica>
<Prodavnica>3</Prodavnica>
<Prodavnica>4</Prodavnica>
</Prodavnice>
</Proizvod>
<Proizvod id="2">
<ime_proizvoda>Hleb</ime_proizvoda>
<vrsta_proizvoda>Pekarski proizvod</vrsta_proizvoda>
<merna_jedinica>gram</merna_jedinica>
<Prodavnice>
<Prodavnica>1</Prodavnica>
<Prodavnica>2</Prodavnica>
<Prodavnica>3</Prodavnica>
</Prodavnice>
</Proizvod>
<Proizvod id="3">
<ime_proizvoda>Suvi vrat</ime_proizvoda>
<vrsta_proizvoda>Mesna preradjevina</vrsta_proizvoda>
<merna_jedinica>gram</merna_jedinica>
<Prodavnice>
<Prodavnica>2</Prodavnica>
<Prodavnica>3</Prodavnica>
<Prodavnica>4</Prodavnica>
</Prodavnice>
</Proizvod>
<Proizvod id="4">
<ime_proizvoda>Pecenica</ime_proizvoda>
<vrsta_proizvoda>Mesna preradjevina</vrsta_proizvoda>
<merna_jedinica>100 grama</merna_jedinica>
<Prodavnice>
<Prodavnica>1</Prodavnica>
<Prodavnica>2</Prodavnica>
<Prodavnica>4</Prodavnica>
</Prodavnice>
</Proizvod>
我的 XML 文件是这样的:
<Items>
<Nested_item>
<id>1</id>
<name>nested</name>
<description>
<desc_item>1</desc_item>
<desc_item>2</desc_item>
<desc_item>3</desc_item>
</description>
</Nested_item>
<Nested_item>
<id>2</id>
<name>nested2</name>
<description>
<desc_item>1</desc_item>
<desc_item>2</desc_item>
<desc_item>3</desc_item>
</description>
</Nested_item>
<Nested_item>
<id>3</id>
<name>nested3</name>
<description>
<desc_item>1</desc_item>
<desc_item>2</desc_item>
<desc_item>3</desc_item>
</description>
</Nested_item>
</Items>
并且我有 class 个带有我放入 ArrayList 的属性的项目,我设法解析了除 desc_item 之外的所有属性(我需要它作为每个 Item 对象的 ArrayList)。例如,我如何告诉解析器只取第三项,并将那些 desc_item 值作为字符串?
我找到了问题的解决方案,我已经解析了内部数据,然后解析了特定数据:
private ArrayList<Proizvod> parseXML (XmlPullParser parser) throws XmlPullParserException, IOException {
ArrayList<Proizvod> proizvodLista = null;
int eventType = parser.getEventType();
Proizvod proizvod = null;
while(eventType != XmlPullParser.END_DOCUMENT){
String name;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
proizvodLista = new ArrayList<Proizvod>();
break;
case XmlPullParser.START_TAG:
name = parser.getName();
//System.out.println(name);
if(name.equals("Proizvod")){
proizvod = new Proizvod();
proizvod.setId(parser.getAttributeValue(null, "id"));
}else if(proizvod != null){
if(name.equalsIgnoreCase("ime_proizvoda")){
proizvod.setIme_proizvoda(parser.nextText());
}else if(name.equalsIgnoreCase("vrsta_proizvoda")){
proizvod.setVrsta_proizvoda(parser.nextText());
}else if(name.equalsIgnoreCase("merna_jedinica")){
proizvod.setVrsta_proizvoda(parser.nextText());
}else if(name.equalsIgnoreCase("Prodavnice")){
proizvod.setLista_prodavnica(parsing(parser));
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if(name.equalsIgnoreCase("proizvod")&& proizvod !=null){
proizvodLista.add(proizvod);
}
}
eventType = parser.next();
}
return proizvodLista;
}
private ArrayList<String> parsing (XmlPullParser parser) throws XmlPullParserException, IOException {
String print = null;
int eventType = parser.getEventType();
ArrayList<String> lista = new ArrayList<String>();
while(eventType != XmlPullParser.END_DOCUMENT){
String name = parser.getName();
if(name.equalsIgnoreCase("Prodavnice")){break;}
else{
if(eventType==XmlPullParser.START_TAG){
print = parser.nextText();
lista.add(print);
System.out.println(print);
}
}
eventType = parser.next();
}
return lista;
}
我的 XML 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<Proizvodi>
<Proizvod id="1">
<ime_proizvoda>Mleko</ime_proizvoda>
<vrsta_proizvoda>mlecni proizvod</vrsta_proizvoda>
<merna_jedinica>litar</merna_jedinica>
<Prodavnice>
<Prodavnica>1</Prodavnica>
<Prodavnica>3</Prodavnica>
<Prodavnica>4</Prodavnica>
</Prodavnice>
</Proizvod>
<Proizvod id="2">
<ime_proizvoda>Hleb</ime_proizvoda>
<vrsta_proizvoda>Pekarski proizvod</vrsta_proizvoda>
<merna_jedinica>gram</merna_jedinica>
<Prodavnice>
<Prodavnica>1</Prodavnica>
<Prodavnica>2</Prodavnica>
<Prodavnica>3</Prodavnica>
</Prodavnice>
</Proizvod>
<Proizvod id="3">
<ime_proizvoda>Suvi vrat</ime_proizvoda>
<vrsta_proizvoda>Mesna preradjevina</vrsta_proizvoda>
<merna_jedinica>gram</merna_jedinica>
<Prodavnice>
<Prodavnica>2</Prodavnica>
<Prodavnica>3</Prodavnica>
<Prodavnica>4</Prodavnica>
</Prodavnice>
</Proizvod>
<Proizvod id="4">
<ime_proizvoda>Pecenica</ime_proizvoda>
<vrsta_proizvoda>Mesna preradjevina</vrsta_proizvoda>
<merna_jedinica>100 grama</merna_jedinica>
<Prodavnice>
<Prodavnica>1</Prodavnica>
<Prodavnica>2</Prodavnica>
<Prodavnica>4</Prodavnica>
</Prodavnice>
</Proizvod>