請利用sax編寫程式解析yahoo的xml格式的天氣預報,獲取當天和第二天的天氣。
背景知識:handler是處理器。parser是解析器。parser負責讀xml,handler負責處理parser讀出的資訊。
以下是別人的程式和自己的分析
#! -*- coding:utf-8 -*-
from xml.parsers.expat import parsercreate
class
weathersaxhandler
(object):
def__init__
(self):
#定義了乙個字典,裝資料
self._data = {}
#定義_daycount來控制輸出今天和明天的天氣。這個要結合後面**體會,很有意思。
self._daycount = 0
@property
defdata
(self):
return self._data
#分析xml,我們想要的資訊都在start_element裡。
defstart_element
(self, name, attrs):
#如果name為'yweather:location',就把attrs['city']的值給self._data['city']
if name == 'yweather:location':
self._data['city'] = attrs['city']
self._data['country'] = attrs['country']
elif name == 'yweather:forecast':
if self._daycount == 0:
self._data['today'] = {}
self._data['today']['text'] = attrs['text']
self._data['today']['low'] = int(attrs['low'])
self._data['today']['high'] = int(attrs['high'])
self._daycount += 1
elif self._daycount == 1:
self._data['tomorrow'] = {}
self._data['tomorrow']['text'] = attrs['text']
self._data['tomorrow']['low'] = int(attrs['low'])
self._data['tomorrow']['high'] = int(attrs['high'])
self._daycount += 1
defend_element
(self, name):
pass
defchar_data
(self, text):
pass
defparse_weather
(xml):
handler = weathersaxhandler()
parser = parsercreate()
parser.startelementhandler = handler.start_element
parser.endelementhandler = handler.end_element
parser.characterdatahandler = handler.char_data
parser.parse(xml)
#因為前面用了@property,所以這裡用handler.data就可以。
return handler.data
data = r'''<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
yahoo! weather - beijing, cn
wed, 27 may 2015 11:00 am cst
39.91
116.39
wed, 27 may 2015 11:00 am cst
'''weather = parse_weather(data)
assert weather['city'] == 'beijing', weather['city']
assert weather['country'] == 'china', weather['country']
assert weather['today']['text'] == 'partly cloudy', weather['today']['text']
assert weather['today']['low'] == 20, weather['today']['low']
assert weather['today']['high'] == 33, weather['today']['high']
assert weather['tomorrow']['text'] == 'sunny', weather['tomorrow']['text']
assert weather['tomorrow']['low'] == 21, weather['tomorrow']['low']
assert weather['tomorrow']['high'] == 34, weather['tomorrow']['high']
print('weather:', str(weather))
Java解析xml技術分析
在平時工作中,難免會遇到把 xml 作為資料儲存格式。面對目前種類繁多的解決方案,哪個最適合我們呢?在這篇文章中,我對這四種主流方案做乙個不完全評測,僅僅針對遍歷 xml 這塊來測試,因為遍歷 xml 是工作中使用最多的 至少我認為 預 備 測試環境 amd 毒龍1.4g oc 1.5g 256m ...
Java解析xml技術分析
在平時工作中,難免會遇到把 xml 作為資料儲存格式。面對目前種類繁多的解決方案,哪個最適合我們呢?在這篇文章中,我對這四種主流方案做乙個不完全評測,僅僅針對遍歷 xml 這塊來測試,因為遍歷 xml 是工作中使用最多的 至少我認為 預 備 測試環境 amd 毒龍1.4g oc 1.5g 256m ...
C 對於xml操作分析
xml檔案是樹狀結構。其基本組成是 節點,節點屬性,節點值,文件宣告。xml用來存放資料,樹狀格式化後的資料。對於資料操作,無非增刪查改。也就是必然存在特定函式,對xml檔案的節點,節點屬性,節點值進行增刪查改。不同的語言,對應不同的函式名字。但無論進行哪方面的增刪改,第一步都是要找到那個節點,或節...