我已编写此代码来解析此xml:
http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2
但是,当我运行它...它说“APP停止工作”,我无法弄清楚原因......请帮忙!
代码是:
xmlActivity.java
package com.example.xml;
public class XmlActivity extends ListActivity {
static final String URL = "http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2";
// XML node keys
static final String KEY_SeriesRecord = "SeriesRecord"; // parent node
static final String KEY_latitude = "latitude";
static final String KEY_longitude = "longitude";
static final String KEY_location = "location";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(KEY_SeriesRecord);
// looping through all item nodes <item>
for (int i = 0; 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_SeriesRecord, parser.getValue(e, KEY_SeriesRecord));
map.put(KEY_latitude, parser.getValue(e, KEY_latitude));
map.put(KEY_longitude, parser.getValue(e, KEY_longitude));
map.put(KEY_location, parser.getValue(e, KEY_location));
// adding HashList to ArrayList
menuItems.add(map);
}
ListAdapter adapter = new SimpleAdapter(this, menuItems,
R.layout.list_item, new String[] { KEY_latitude, KEY_longitude,
KEY_location }, new int[] { R.id.name, R.id.desciption,
R.id.cost });
setListAdapter(adapter);
// selecting single ListView item
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name))
.getText().toString();
String cost = ((TextView) view.findViewById(R.id.cost))
.getText().toString();
String description = ((TextView) view
.findViewById(R.id.desciption)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(),
SingleMenuItemActivity.class);
in.putExtra(KEY_latitude, name);
in.putExtra(KEY_longitude, cost);
in.putExtra(KEY_location, description);
startActivity(in);
}
});
}
}
SingleMenuItemActivity.java
package com.example.xml;
public class SingleMenuItemActivity extends Activity {
// XML node keys
static final String KEY_latitude = "latitude";
static final String KEY_longitude = "longitude";
static final String KEY_location = "location ";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_list_item);
// getting intent data
Intent in = getIntent();
// Get XML values from previous intent
String latitude = in.getStringExtra(KEY_latitude);
String longitude = in.getStringExtra(KEY_longitude);
String location = in.getStringExtra(KEY_location);
// Displaying all values on the screen
TextView lblName = (TextView) findViewById(R.id.name_label);
TextView lblCost = (TextView) findViewById(R.id.cost_label);
TextView lblDesc = (TextView) findViewById(R.id.description_label);
lblName.setText(latitude);
lblCost.setText(longitude);
lblDesc.setText(location);
}
}
xmlParser.java
package com.example.xml;
public class XMLParser {
// constructor
public XMLParser() {
}
/**
* Getting XML from URL making HTTP request
*
* @param url
* string
* */
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;
}
/**
* Getting XML DOM element
*
* @param XML
* string
* */
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;
}
/**
* Getting node value
*
* @param elem
* element
*/
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 "";
}
/**
* Getting node value
*
* @param Element
* node
* @param key
* string
* */
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
}
答案 0 :(得分:0)
你不能像活动线程中的HttpRequest那样进行慢速操作。您必须将它们放在一个单独的线程(AsyncTask)中。这是谷歌提到的,但我输了源码,对不起。
你应该尝试在这里尝试创建一个AsyncTask:
public class GetSoigneurInfoTask extends AsyncTask<Document, Integer, Document> //Le même code s'applique pour presque tout sauf onPostExecute()
{
Document doc;
String xml;
String url;
public GetSoigneurInfoTask(String URL)
{
url = URL;
}
protected Document doInBackground(Document...params)
{
xml = XmlFunctions.getXML(url);
doc = XmlFunctions.XMLfromString(xml);
return doc;
}
protected void onPostExecute(Document result)
{
if(result != null)
{
NodeList nodeList = doc.getElementsByTagName("RootTag"); //Crée une liste avec les elements sous soigneur
for (int i = 0; i < nodeList.getLength(); i++)
{
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element) node;
NodeList nodelist = element.getElementsByTagName("childTag");
Element element1 = (Element) nodelist.item(0);
NodeList fstNm = element1.getChildNodes();
soignTemp = fstNm.item(0).getNodeValue();
}
}
}
}
因此,您可以在doInBackground()
中调用您的方法,并在onPostExecute()
中完成与UI有关的所有操作!
希望这有帮助!