PDA

View Full Version : پارس کردن فایل xml با استفاده از XMLPullParser



sina4everafter
یک شنبه 05 مرداد 1393, 10:48 صبح
سلام دوستان.
من یه فایل xml و پارس کردم. و مطمئن هستم که درست پارس کردم.
محتویات اون فایل xml یه سری اسم هست. که من می خوام هر کدوم از اون اسم ها رو به یه دکمه اختصاص بدم.ولی نمیشه. من از این کد استفاده می کنم.

categoryParserObject.getCategories().get(i).getNam e();


btn.setText(categoryParserObject.toString());


ممنون اگر راهنماییم کنید. کارم خیلی گیره.

sina4everafter
یک شنبه 05 مرداد 1393, 11:32 صبح
تو رو خدا راهنماییم کنید.ممنون.

poorman
دوشنبه 06 مرداد 1393, 01:52 صبح
سلام

والا من دقیقا نمیدونم شما دارید توی XML به چه صورت آرایه رو مینویسید

ولی خب اندروید خودش این قابلیت رو داره که شما توی XML آرایه رو تعریف کنید و بعد به راحتی ازش توی برنامه استفاده کنید

توی پوشه values یک فایل xml بسازید مثلا به اسم sample_array بعد به صورت زیر داخلش آرایه تون رو قرار بدید

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="testArray">
<item>first</item>
<item>second</item>
<item>third</item>
<item>fourth</item>
<item>fifth</item>
</string-array>
</resources>


آرایه ای به اسم testArray که توی هر خط آیتم هاش رو نوشتید

و توی اکتیویتی یا هرجایی اینطوری این آرایه رو بازیابی کنید

String[] mTestArray = = getResources().getStringArray(R.array.testArray);

sina4everafter
دوشنبه 06 مرداد 1393, 09:24 صبح
سلام.ممنون از راهنماییتون.

این فایل XML منه که داخل فولدر assets قرار دادمش.


<?xml version="1.0" encoding="utf-8"?>


<categories>

<category>
<id>length</id>
<name>طول</name>
</category>

<category>
<id>Power</id>
<name>توان</name>
</category>

<category>
<id>Energy</id>
<name>انرژی</name>
</category>

<category>
<id>Time</id>
<name>زمان</name>
</category>

<category>
<id>Temperature</id>
<name>درجه حرارت</name>
</category>

<category>
<id>Mass</id>
<name>جرم</name>
</category>

<category>
<id>Area</id>
<name>سطح</name>
</category>

<category>
<id>Angle</id>
<name>زاویه</name>
</category>

<category>
<id>Speed</id>
<name>سرعت</name>
</category>

<category>
<id>Volume</id>
<name>حجم</name>
</category>

<category>
<id>Pressure</id>
<name>فشار</name>
</category>
</categories>


این کلاسیه که این xml و پارس می کنه:


import java.io.InputStream;
import java.util.List;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;


import android.content.Context;


import com.asr24.cando.Category.Category;


public class CategoryParser {

List<Category> categories;
private Category category;
Context context;
int counter = 0;

public List<Category> parser(){

XmlPullParserFactory xmlPullParserFactoryObject;
XmlPullParser xmlPullParserObject;

//---try...catch---
try {

xmlPullParserFactoryObject = XmlPullParserFactory.newInstance();
xmlPullParserObject = xmlPullParserFactoryObject.newPullParser();
InputStream inputStream = context.getApplicationContext().getAssets().open("categories");
xmlPullParserObject.setInput(inputStream, null);

//---while loop---
int eventType = xmlPullParserObject.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
counter++;
String tagNAme = xmlPullParserObject.getName();
if (tagNAme.equalsIgnoreCase("category")) {
categories.add(category);
if (tagNAme.equalsIgnoreCase("id")) {
String text = xmlPullParserObject.getText();
category.setId(text);
} if (tagNAme.equalsIgnoreCase("name")) {
String text = xmlPullParserObject.getText();
category.setName(text);
}
}
}//---End of while---
} catch (Exception e) {
e.printStackTrace();
}

return categories;
}

public int getCounter(){
return counter;
}
}


یکی از مشکلاتم اینه که من نمی دونم پارس کردنم درست هست یا نه.

این هم کلاس Category که از متد set و get استفاده کردم.


public class Category {

//---Values---
String name, id;

//---Getter And Setter Method---
public String getId(){
return id;
}
public void setId(String id){
this.id = id;
}

public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}

و این هم کلاس اصلیه که قراره با استفاده از اون فایل xml ای که پارس کرده یه سری دکمه درست کنه و نام گذاریش کنه.


import java.util.List;


import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;


import com.asr24.cando.Category.Category;


public class XmlPullParserActivity extends Activity {


Button btn;

List<Category> categories;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);

LinearLayout li = (LinearLayout) findViewById(R.id.li);


for (int i = 0; i < 11; i++) {

btn = new Button(this);
li.addView(btn);
categories.get(i).getName();
btn.setText(categories.toString());
}
}
}


الان اگر دو خط آخر حلقه for و پاک کنیم برنامه اجرا میشه و دکمه ها هم ایجاد میشه. ولی اگر پاک نکنیم برنامه کرش می کنه و Logcat اروره NullPointerException میده.

در ضمن اگر شرط حلقه رو نگاه کنید من به صورت دستی عدد 11 و وارد کردم. ولی می خوام به تعدا دفعاتی که حلقه while داخل کلاسی که فایل xml پارس می کنه اجرا بشه. اگر دقت کنید من یه متغیری به نام counter داخل حلقه while گذاشتم و return ش کردم. اما وقتی داخل کلاس اصلی استفاده می کنم مقدارش صفره.

راستیتش اونجوری که شما گفتین، یعنی یه آرایه درست کنم و ... ، انجام دادم. ولی ازم ایراد گرفتن. گفتن که باید مثلا کلاس CategoryParser فقط وظیفش پارس کردن فایل xml باشه. حالا اینکه ما می خوام از اون فایل xml برای نام گذاری دکمه ها یا یه لیست ویو و یا هر چیزه دیگه استفاده کنیم و باید داخل کلاس اصلی تعریف کنیم. یعنی الان من اون متغیر counter یی هم که تعریف کردم غلطه. ولی راه حله دیگه ای به ذهنم نرسید که بخوام انجامش بدم.

sina4everafter
دوشنبه 06 مرداد 1393, 13:01 عصر
از دوستانی که اطلاع دارند لطفا راهنمایی کنن. ممنون.:بوس:

poorman
سه شنبه 07 مرداد 1393, 00:13 صبح
والا من اطلاعی از پارس کردن فایل xml ندارم

ولی قطعه کدی که بهتون دادم ساده ترین راهه و به نظرم شما دارید راه خیلی سخت رو انتخاب میکنید

sina4everafter
سه شنبه 07 مرداد 1393, 19:42 عصر
خواهش می کنم دوست عزیز. شما خیلی توی این پروژه بم کمک کردین. مشکلم هم تا حدودی حل شده. ممنون ازشما.