Android开发中用的最多的是json数据,很少用到xml,上次项目中需要获取天气预报的xml数据,于是研究了下xml解析,我使用的是dom解析,贴出代码,大家交流学习~
服务端xml数据:
这里写代码片
<response>
<status>0</status>
<result>
<city>深圳市</city>
<update_time>2015-06-29</update_time>
<temperature>33 ~ 28℃</temperature>
<weather>多云</weather>
<wind>微风</wind>
<ultraviolet>中等</ultraviolet>
<create_time>2015-06-29 13:30:36</create_time>
<weather_future>
<temperature_1>33 ~ 28℃</temperature_1>
<weather_1>多云</weather_1>
<wind_1>微风</wind_1>
<temperature_2>33 ~ 28℃</temperature_2>
<weather_2>阵雨</weather_2>
<wind_2>微风</wind_2>
</weather_future>
</result>
</response>
android解析代码:返回天气实体对象,就一个方法。
public static WeatherInfo parseXml(InputStream inStream) throws Exception {
这里写代码片
WeatherInfo weatherInfo = null;
// 实例化一个文档构建器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 通过文档构建器工厂获取一个文档构建器
DocumentBuilder builder = factory.newDocumentBuilder();
// 通过文档构建器构建一个文档实例
Document document = builder.parse(inStream);
// 获取XML文件根节点
Element root = document.getDocumentElement();
//获取根节点下的所有子节点
NodeList versionNode = root.getChildNodes();
//遍历所有子节点,过滤节点
for (int i = 0; i < versionNode.getLength(); i++) {
//获取子节点
Node versionN = (Node) versionNode.item(i);
//如果是元素节点,将节点强制转换成元素节点
if (versionN.getNodeType() == Node.ELEMENT_NODE) {
Element versionRoot = (Element) versionN;
//在获取result下的子节点
if ("result".equals(versionRoot.getNodeName())) {
// 获得所有子节点,遍历result节点中的子节点
NodeList childNodes = versionRoot.getChildNodes();
//实例化封装数据的实体,天气
weatherInfo = new WeatherInfo();
for (int j = 0; j < childNodes.getLength(); j++) {
// 遍历子节点,获取对应想要的数据
Node childNode = (Node) childNodes.item(j);
if (childNode.getNodeType() == Node.ELEMENT_NODE) {
Element childElement = (Element) childNode;
//城市
if ("city".equals(childElement.getNodeName())) {
weatherInfo.setCity(childElement
.getFirstChild().getNodeValue());
}
//更新时间
else if (("update_time".equals(childElement
.getNodeName()))) {
weatherInfo.setUpdate_time(childElement
.getFirstChild().getNodeValue()); //温度
} else if (("temperature").equals(childElement
.getNodeName())) {
weatherInfo.setToday_temperature(childElement
.getFirstChild().getNodeValue());
}
else if (("weather").equals(childElement
.getNodeName())) {
weatherInfo.setToday_weather(childElement
.getFirstChild().getNodeValue());
} else if (("wind").equals(childElement
.getNodeName())) {
weatherInfo.setToday_wind(childElement
.getFirstChild().getNodeValue());
}
else if (("ultraviolet").equals(childElement
.getNodeName())) {
weatherInfo.setToday_ultraviolet(childElement
.getFirstChild().getNodeValue());
}
else if (("create_time").equals(childElement
.getNodeName())) {
weatherInfo.setCreate_time(childElement
.getFirstChild().getNodeValue());
}
else if (("weather_future").equals(childElement
.getNodeName())) {
NodeList childNodes1 = childElement
.getChildNodes();
for (int k = 0; k < childNodes1.getLength(); k++) {
Node childNode1 = (Node) childNodes1
.item(k);
if (childNode1.getNodeType() == Node.ELEMENT_NODE) {
Element childElement1 = (Element) childNode1;
if (("temperature_1")
.equals(childElement1
.getNodeName())) {
weatherInfo
.setTomorrow_temperature(childElement1
.getFirstChild()
.getNodeValue());
} else if (("weather_1")
.equals(childElement1
.getNodeName())) {
weatherInfo
.setTomorrow_weather(childElement1
.getFirstChild()
.getNodeValue());
} else if (("wind_1")
.equals(childElement1
.getNodeName())) {
weatherInfo
.setTomorrow_wind(childElement1
.getFirstChild()
.getNodeValue());
} else if (("temperature_2")
.equals(childElement1
.getNodeName())) {
weatherInfo
.setDft_temperature(childElement1
.getFirstChild()
.getNodeValue());
} else if (("weather_2")
.equals(childElement1
.getNodeName())) {
weatherInfo
.setDft_weather(childElement1
.getFirstChild()
.getNodeValue());
} else if (("wind_2")
.equals(childElement1
.getNodeName())) {
weatherInfo
.setDft_wind(childElement1
.getFirstChild()
.getNodeValue());
}
}
}
}
}
}
}
}
}
return weatherInfo;
}