Я пытаюсь использовать DOM4j для фазирования XML-канала RSS на Android. Я добавляю dom4j.jar в lib \ и пользовательское разрешение.DOM4j не работает на Android
<uses-permission android:name="android.permission.INTERNET"/>
Я также скомпилировал этот исходный код в чистом Java-проекте, и он работает! Я смущен, если есть какие-либо ограничения на Android (если да, какие методы я могу использовать), или только я допустил некоторые ошибки.
Части LogCat:
03-15 23:27:10.611: W/System.err(10453): org.dom4j.DocumentException: Couldn't open http://tw.news.yahoo.com/rss/ Nested exception: Couldn't open http://tw.news.yahoo.com/rss/
03-15 23:27:10.621: W/System.err(10453): at org.dom4j.io.SAXReader.read(SAXReader.java:484)
03-15 23:27:10.621: W/System.err(10453): at org.dom4j.io.SAXReader.read(SAXReader.java:291)
03-15 23:27:10.621: W/System.err(10453): at tw.danny.rss_dom4j.RSSDom4jMainActivity.onCreate(RSSDom4jMainActivity.java:28)
03-15 23:27:10.621: W/System.err(10453): at android.app.Activity.performCreate(Activity.java:5206)
03-15 23:27:10.626: W/System.err(10453): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
03-15 23:27:10.626: W/System.err(10453): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
...
Вот OnCreate функции в основной деятельности:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rssdom4j_main);
try {
URL url = new URL("http://tw.news.yahoo.com/rss/");
SAXReader saxReader = new SAXReader();
//?
Document document = saxReader.read(url);
Element channel = (Element) document.getRootElement().element(
"channel");
for (Iterator i = channel.elementIterator("item"); i.hasNext();) {
Element element = (Element) i.next();
System.out.println("title: " + element.elementText("title"));
String descrip_original = element.elementText("description");
if (descrip_original.startsWith("<p>")) {
// address html-like layout
System.out.println(descrip_original.substring(
descrip_original.indexOf("</a>") + 4,
descrip_original.length() - 1));
}
System.out.println("link: " + element.elementText("link"));
System.out
.println("pubDate: " + element.elementText("pubDate"));
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Проблемы могут возникнуть в этой строке:
SAXReader saxReader = new SAXReader();
Большое спасибо, это работает :) У меня есть другой вопрос. Почему я не могу написать phasher в другом классе .java и вызвать метод, подобный RSSPhasher.parse() в потоке? – user2174595
Вы можете, если вы вызываете какие-либо сетевые операции с основного потока пользовательского интерфейса. Вы должны быть осторожны с синтаксическими анализаторами SAX, поскольку они анализируют входной поток. Если ваш запрос возвращает большой набор данных, метод 'read()' может возвращаться, но последующий синтаксический анализ может снова обратиться к сети. У DOM-парсеров не было бы этой проблемы, поскольку они читали/строили за один присест, но, конечно, у вас там более высокие требования к памяти. – 323go
Спасибо вам ответ. Я использую DOM-парсер, и он работает. – user2174595