其实网上很多资料讲关于解析xml的问题,大多数我都看的一知半解,今天终于找了个不错的例子,放在这里跟大家共享:
先上代码:
1.DomParseXml.java文件
2.main.xml文件内容:
3.每次都强调下的一条:
另外我经常遇到在启动模拟器的时候那个模拟器连不上互联网,那个右上角的信号图标是个叉,我也不知道怎么修改,重新启动了下模拟器后就又可以联网了.不知道是什么原因,我们这种联网的应用如果在测试的时候没有注意到这的话,程序就会报错,说:
can't reach the host之类的,哪位兄弟姐妹知道是什么原因的话,麻烦告知一下,谢谢
另外附上查询到的xml文件:
先上代码:
1.DomParseXml.java文件
package cn.com;
import java.io.File;
import java.io.InputStreamReader;
import java.net.URL;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class DomParseXml extends Activity implements OnClickListener {
File fl;
//这个地址返回的内容的xml文件我下面会贴上
//大家可以先跳过这个java文件看下xml文件结构
private final String net = "http://www.google.com/ig/api?hl=zh-cn&weather=";
private String addr;
ListView lv;
ArrayAdapter<String> adapter;
private EditText et;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(this);
//输入一个城市(wuhan或beijing等)
et = (EditText) findViewById(R.id.et);
}
@Override
public void onClick(View agr0) {
// TODO Auto-generated method stub
addr = et.getText().toString();
switch (agr0.getId()) {
case R.id.bt:
// 获取输入的内容,取出空格
if (!addr.trim().equals("")) {
addr = net + addr;
// System.out.println(addr);
String[] data = null;
// 将weather设置为根节点
// Node nRoot = root(addr,"weather").item(0);
// 这里返回的是一个NodeList
Node nRoot = root(addr, "forecast_information").item(0);
// 获得孩子结点
NodeList child = nRoot.getChildNodes();
// 获得子节点的个数 7
int childSize = child.getLength();
System.out.println("**********childSize************"
+ childSize);
data = new String[childSize];
for (int i = 0; i < childSize; i++) {
// 第一个子节点,city
Node nChild = child.item(i);
// 获得子节点
if (nChild.hasAttributes()) {
// 获得节点属性
data[i] = nChild.getAttributes().getNamedItem("data")
.getNodeValue();
System.out.println("**********************" + data[i]);
}
}
}
setTitle(et.getText().toString()); // 显示查询的城市
break;
}
}
private NodeList root(final String url, final String str) {
NodeList root = null;
try {
InputSource is = new InputSource(new InputStreamReader(new URL(url)
.openStream()));
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
DocumentBuilder dom = factory.newDocumentBuilder();
Document doc = dom.parse(is);
root = doc.getElementsByTagName(str);
} catch (Exception e) {
e.printStackTrace();
}
return root;
}
}
2.main.xml文件内容:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<EditText android:text="" android:id="@+id/et"
android:layout_width="150dp" android:layout_height="wrap_content"></EditText>
<Button android:text="button" android:id="@+id/bt"
android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>
3.每次都强调下的一条:
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
另外我经常遇到在启动模拟器的时候那个模拟器连不上互联网,那个右上角的信号图标是个叉,我也不知道怎么修改,重新启动了下模拟器后就又可以联网了.不知道是什么原因,我们这种联网的应用如果在测试的时候没有注意到这的话,程序就会报错,说:
can't reach the host之类的,哪位兄弟姐妹知道是什么原因的话,麻烦告知一下,谢谢
另外附上查询到的xml文件:
<?xml version="1.0" ?>
- <xml_api_reply version="1">
- <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
- <forecast_information>
<city data="Beijing, Beijing" />
<postal_code data="beijing" />
<latitude_e6 data="" />
<longitude_e6 data="" />
<forecast_date data="2010-07-01" />
<current_date_time data="2010-07-02 00:00:00 +0000" />
<unit_system data="SI" />
</forecast_information>
- <current_conditions>
<condition data="晴" />
<temp_f data="73" />
<temp_c data="23" />
<humidity data="湿度: 83%" />
<icon data="/ig/images/weather/sunny.gif" />
<wind_condition data="风向: 北、风速:4 米/秒" />
</current_conditions>
- <forecast_conditions>
<day_of_week data="周四" />
<low data="21" />
<high data="33" />
<icon data="/ig/images/weather/chance_of_rain.gif" />
<condition data="可能有雨" />
</forecast_conditions>
- <forecast_conditions>
<day_of_week data="周五" />
<low data="22" />
<high data="33" />
<icon data="/ig/images/weather/sunny.gif" />
<condition data="晴" />
</forecast_conditions>
- <forecast_conditions>
<day_of_week data="周六" />
<low data="24" />
<high data="33" />
<icon data="/ig/images/weather/mostly_sunny.gif" />
<condition data="以晴为主" />
</forecast_conditions>
- <forecast_conditions>
<day_of_week data="周日" />
<low data="21" />
<high data="35" />
<icon data="/ig/images/weather/mostly_sunny.gif" />
<condition data="晴间多云" />
</forecast_conditions>
</weather>
</xml_api_reply>