我的应用程序被关闭,无法使用 url 运行有更多字符。我在我的应用程序中使用 xml 解析器来处理文章。如果我这样调用 url,我的应用程序将强制关闭。
http://api.news.com/newsServices.asmx/getArticleByCategoryWithDetails?categoryname=nasional&start=0&limit=10
但如果我这样调用 url,我的应用程序可以运行。
http://api.news.com/news,Services.asmx/getArticle
这是我的代码:
public class news extends Activity {
private Activity activity;
public ImageLoader imageLoader;
String URL = "http://api.news.com/newsServices.asmx/getArticleByCategoryWithDetails?categoryname=nasional&start=0&limit=10";
// XML node key
static final String KEY_ARTICLE = "Article"; // parent node
static final String KEY_ID = "ArticleID";
static final String KEY_AUTHOR = "Author";
static final String KEY_HEADLINE = "Headline";
static final String KEY_ARTICLEDATE = "ArticleDate";
static final String KEY_VIEWED = "Viewed";
static final String KEY_PUBLISHEDAT = "PublishedAt";
static final String KEY_SUMMARY = "Summary";
static final String KEY_BODY = "Body";
static final String KEY_IMAGEURL = "ImageURL";
static final String KEY_SLUG = "Slug";
static final String KEY_CATEGORY = "Category";
ListView list ;
LazyAdapter adapter;
private NodeList nl;
private xmlParser parser;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news);
activity = this;
ArrayList<HashMap<String, String>> songsList2 = new ArrayList<HashMap<String, String>>();
parser = new xmlParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element
Log.i("parser star", xml);
nl = doc.getElementsByTagName(KEY_ARTICLE);
// looping through all song nodes <song>
for (int i = 1; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(KEY_ID, parser.getValue(e, KEY_ID));
map.put(KEY_HEADLINE, parser.getValue(e, KEY_HEADLINE));
map.put(KEY_ARTICLEDATE, parser.getValue(e, KEY_ARTICLEDATE));
map.put(KEY_IMAGEURL, parser.getValue(e, KEY_IMAGEURL));
map.put(KEY_BODY, parser.getValue(e,KEY_BODY));
// adding HashList to ArrayList
songsList2.add(map);
}
list=(ListView)findViewById(R.id.list);
// Getting adapter by passing xml data ArrayList
adapter=new LazyAdapter(this, songsList2);
list.setAdapter(adapter);
日志猫:
12-19 09:40:06.154: E/Error:(30404): Unexpected token (position:TEXT Request format i...@2:1 in java.io.StringReader@413cc940)
12-19 09:40:06.154: I/parser star(30404): Request format is invalid: .
12-19 09:40:06.154: D/AndroidRuntime(30404): Shutting down VM
12-19 09:40:06.154: W/dalvikvm(30404): threadid=1: thread exiting with uncaught exception (group=0x40a991f8)
12-19 09:40:06.154: E/AndroidRuntime(30404): FATAL EXCEPTION: main
12-19 09:40:06.154: E/AndroidRuntime(30404): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.news/com.news.news}: java.lang.NullPointerException
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.ActivityThread.access$600(ActivityThread.java:123)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.os.Handler.dispatchMessage(Handler.java:99)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.os.Looper.loop(Looper.java:137)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.ActivityThread.main(ActivityThread.java:4424)
12-19 09:40:06.154: E/AndroidRuntime(30404): at java.lang.reflect.Method.invokeNative(Native Method)
12-19 09:40:06.154: E/AndroidRuntime(30404): at java.lang.reflect.Method.invoke(Method.java:511)
12-19 09:40:06.154: E/AndroidRuntime(30404): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-19 09:40:06.154: E/AndroidRuntime(30404): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-19 09:40:06.154: E/AndroidRuntime(30404): at dalvik.system.NativeStart.main(Native Method)
12-19 09:40:06.154: E/AndroidRuntime(30404): Caused by: java.lang.NullPointerException
12-19 09:40:06.154: E/AndroidRuntime(30404): at com.news.news.onCreate(news.java:80)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.Activity.performCreate(Activity.java:4465)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
12-19 09:40:06.154: E/AndroidRuntime(30404): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
12-19 09:40:06.154: E/AndroidRuntime(30404): ... 11 more
这是 xml 解析器类
public class xmlParser {
// constructor
public xmlParser() {
}
public String getXmlFromUrl(String url) {
String xml = null;
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
xml = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// return XML
return xml;
}
public Document getDomElement(String xml){
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (SAXException e) {
Log.e("Error: ", e.getMessage());
return null;
} catch (IOException e) {
Log.e("Error: ", e.getMessage());
return null;
}
return doc;
}
public final String getElementValue( Node elem ) {
Node child;
if( elem != null){
if (elem.hasChildNodes()){
for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
if( child.getNodeType() == Node.TEXT_NODE ){
return child.getNodeValue();
}
}
}
}
return "";
}
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
}