我正在尝试解析xml文件。但是方法getAttributeValue
总是为我返回null。首先,这是xml文件
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
这是我的代码。我用AsyncTask
public class XmlParser extends AsyncTask<Void, Void, String> {
private XmlPullParserFactory xmlFactoryObject;
private XmlPullParser myParser;
private File file;
FileInputStream fis;
String value;
public XmlParser() {
try {
xmlFactoryObject = XmlPullParserFactory.newInstance();
myParser = xmlFactoryObject.newPullParser();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
public void setFile(File file1) {
file = file1;
execute();
}
@Override
protected void onPreExecute() {
super.onPreExecute();
try {
if(file == null){
Toast.makeText(getActivity(), "NULL", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getActivity(), "NOT NULL " + file.getName(), Toast.LENGTH_LONG).show();
fis = new FileInputStream(file);
myParser.setInput(fis, null);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(Void... params) {
int event = 0;
try {
event = myParser.getEventType();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
break;
case XmlPullParser.END_TAG:
if(name.equals("from")){
value = myParser.getAttributeValue(null, "value"); // this line always return null
Log.d(getTag(), "NEZINAU " + value);
}
break;
}
try {
event = myParser.next();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
Log.d(getTag(), "BAD " + e.getLocalizedMessage());
}
}
return value;
}
@Override
protected void onPostExecute(String aVoid) {
super.onPostExecute(aVoid);
System.out.println("myEND " + aVoid);
Toast.makeText(getActivity(), "THE END!!! " + value, Toast.LENGTH_LONG).show();
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
value = myParser.getAttributeValue(null, "value"); // this line always return null
这一行总是返回null。为什么?
XML中的属性是这样的:
<Tag attribute="value">content</Tag>
XML文档中的标记没有属性。您希望使用xmlPullParser.getText()
来获取开始和结束标记之间的文本内容。
您必须在XmlPullParser.TEXT事件上使用XmlPullParser.getText()检索值。请看下面的例子:http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
试试这样写:
String currentName = "";
while (event != XmlPullParser.END_DOCUMENT) {
String name=myParser.getName();
switch (event){
case XmlPullParser.START_TAG:
currentName = name;
break;
case XmlPullParser.TEXT:
if("from".equals(currentName)){
value = myParser.getText();
Log.d(getTag(), "NEZINAU " + value);
}
break;
case XmlPullParser.END_TAG:
break;
}