使用JDOM2解析XML文件Android
我遇到了一个问题,需要使用库JDOM2(确切地说是2.0.5)解析Android应用程序中的XML文件。使用JDOM2解析XML文件Android
在一个Java项目,它工作正常,但在Android应用程序的项目,我有以下消息:“无法打开http://jeancdc.perso.sfr.fr/fichierXML.xml”
这里是我的XMLReader类:
package fr.jcdc.exemple.jdom;
import java.io.IOException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import android.util.Log;
public class XMLReader {
public XMLReader() {
super();
}
public void loading() {
try {
SAXBuilder builder = new SAXBuilder();
Document document = (Document) builder.build("http://jeancdc.perso.sfr.fr/fichierXML.xml");
Element rootNode = document.getRootElement();
List<Element> charactersList = rootNode.getChildren("personnage");
for (int i = 0; i < charactersList.size(); i++) {
Element node = (Element) charactersList.get(i);
Log.d("tag", node.getChildText("prenom") + " " + node.getChildText("nom"));
}
}
catch (IOException ioex) {
Log.d("ioex", ioex.getMessage());
}
catch (JDOMException jdomex) {
Log.d("jdomex", jdomex.getMessage());
}
}
}
我的主类:
package fr.jcdc.exemple.jdom;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
private XMLReader xmlReader = new XMLReader();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xmlReader.loading();
}
}
这是异常跟踪,我在日志中获取的一部分:
06-24 22:58:39.794: D/ioex(18560): Couldn't open http://jeancdc.perso.sfr.fr/fichierXML.xml
06-24 22:58:39.794: W/System.err(18560): java.io.IOException: Couldn't open http://jeancdc.perso.sfr.fr/fichierXML.xml
06-24 22:58:39.864: W/System.err(18560): at org.apache.harmony.xml.ExpatParser.openUrl(ExpatParser.java:755)
06-24 22:58:39.864: W/System.err(18560): at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:292)
06-24 22:58:39.864: W/System.err(18560): at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217)
06-24 22:58:39.864: W/System.err(18560): at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:277)
06-24 22:58:39.864: W/System.err(18560): at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1141)
.....
06-24 22:58:39.864: W/System.err(18560): Caused by: android.os.NetworkOnMainThreadException
06-24 22:58:39.872: W/System.err(18560): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
06-24 22:58:39.872: W/System.err(18560): at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
06-24 22:58:39.872: W/System.err(18560): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
06-24 22:58:39.880: W/System.err(18560): ... 20 more
最后的评论帮助很大。查看NetworkOnMainThreadException的谷歌搜索结果
您不再允许您从应用程序的主线程访问网络。创建一个带回调的子线程来加载XML
好的,为了验证,我通过更改AndroidManifest.xml中的以下行将目标更改为版本9:android:targetSdkVersion =“9”,它可以工作。所以现在,我必须实现其他线程才能与更高的API兼容。谢谢 ! –
尝试传递URL而不是传递字符串。
java.net.URL temp;
try {
temp = new java.net.URL("http://jeancdc.perso.sfr.fr/fichierXML.xml");
} catch (java.net.MalformedURLException e) {
temp = null;
}
Document document = (Document) builder.build(temp);
已经尝试过,不幸的是,它不能解决问题。我上面加入了一个日志文件。 –
您的应用程序是否具有网络权限? – rolfl
我在AndroidManifest.xml中添加了这一行: 我需要添加其他权限吗? –
给出关于错误信息的更多细节如何。有没有原因? – rolfl