XML解析与发布-订阅模式
XML解析与发布-订阅模式
第一部分:XML解析
1.1 读取并解析tang300.xml文件,首先请按行打印出来文件的内容,10行即可。
关于xml解析的相关代码,可以参看https://www.runoob.com/python/python-xml.html
f = open('.\\tang300.xml','r',encoding='UTF-8')
for line in f.readlines()[0:10]:
print(line)
f.close()
<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2021-03-21T09:57:18">
<作业用唐诗>
<ID>1</ID>
<Poem_id>4371</Poem_id>
<line_number>-100</line_number>
<contance>##餞唐永昌( 一作餞唐郎中洛陽令)</contance>
</作业用唐诗>
<作业用唐诗>
<ID>2</ID>
1.2 各保存20首李白、杜甫、白居易、王維(維是繁体)的诗(题目以及内容)。要求为每首诗歌生成独立的数据对象,包括 标题、作者、诗内容(按行)的元组(tuple)
import xml.dom.minidom
import xml.sax
from collections import OrderedDict
import re
'''
使用minidom解析器打开 XML 文档,当然使用sax也行。或者也可以尝试自己写解析算法,比如正则表达式。
不同的方法实现得好都有机会被作为作业样本并获得加分
'''
DOMTree = xml.dom.minidom.parse("tang300.xml")
collection = DOMTree.documentElement
# print(collection)
# 在集合中获取所有诗句
poems = collection.getElementsByTagName("作业用唐诗")
poemIDdict = {}
poemSavedDict = {}
authorSavedList = []
strinfo = re.compile(r'[#&$%%]')
for poem in poems:
# ID = poem.getElementsByTagName('ID')[0].childNodes[0].data
Poem_id = int(poem.getElementsByTagName('Poem_id')[0].childNodes[0].data)
line_number = int(poem.getElementsByTagName('line_number')[0].childNodes[0].data)
contance_tmp = poem.getElementsByTagName('contance')[0].childNodes[0].data
contance = strinfo.sub('', contance_tmp)
if Poem_id not in poemIDdict:
poemIDdict[Poem_id] = {line_number: contance}
else:
poemIDdict[Poem_id][line_number] = contance
#print(poemIDdict[4371])
def saved_poem(name,num):
count = 0
poemlist = []
authorSavedList.append(name)
for i in poemIDdict.values():
poemtmpList = []
i = OrderedDict(sorted(i.items(),key = lambda t:t[0]))
if i[-1] == name:
count += 1
for v in i.values():
poemtmpList.append(v)
poemlist.append(tuple(poemtmpList))
if count == num:
break
if len(poemlist) < num:
print('#####诗人{}的诗不足{}首#####'.format(name,num))
if name not in poemSavedDict:
poemSavedDict[name] = poemlist
else:
poemSavedDict[name] += poemlist
return poemlist
lb = saved_poem('李白',20)
df = saved_poem('杜甫',20)
bjy = saved_poem('白居易',20)
ww = saved_poem('王維',20)
print(lb)
[('登峴山亭寄晉陵張少府', '李白', '峴首風湍急', '雲帆若鳥飛', '憑軒試一問', '張翰欲來歸'), ('送朱大入秦', '李白', '遊人武陵去', '寶劍直千金', '分手脫相贈', '平生一片心'), ('結襪子', '李白', '燕南壯士吳門豪', '築中置鉛魚隱刀', '感君恩重許君命', '太山一擲輕鴻毛'), ('玉階怨', '李白', '玉階生白露', '夜久侵羅襪', '卻下水晶簾', '玲瓏望秋月'), ('洛陽陌', '李白', '白玉誰家郎', '迴車渡天津', '看花東陌上', '驚動洛陽人'), ('高句驪', '李白', '金花折風帽', '白馬小遲迴', '翩翩舞廣袖', '似鳥海東來'), ('舍利弗', '李白', '金繩界寶地', '珍木蔭瑤池', '雲間妙音奏', '天際法蠡吹'), ('靜夜思', '李白', '床前看月光', '疑是地上霜', '舉頭望明月', '低頭思故鄉'), ('淥水曲', '李白', '淥水明秋月( 一作日)', '南湖采白蘋', '荷花嬌欲語', '愁殺蕩舟人'), ('估客行 一作樂', '李白', '海客乘天風', '將船遠行役', '譬如雲中鳥', '一去無蹤跡'), ('峨眉山月歌', '李白', '峨眉山月半輪秋', '影入平羌江水流', '夜髮清谿向三峽', '思君不見下渝州'), ('東魯見狄博通', '李白', '去年別我向何處', '有人傳道遊江東', '謂言挂席度滄海', '卻來應是無長風'), ('贈華州王司士', '李白', '淮水不絕濤瀾高', '盛德未泯生英髦', '知君先負廟堂器', '今日還須贈寶刀'), ('聞謝楊兒吟猛虎詞因此有贈', '李白', '同州隔秋浦', '聞吟猛虎詞', '晨朝來借問', '知是謝楊兒'), ('巴陵贈賈舍人', '李白', '賈生西望憶京華', '湘浦南遷莫怨嗟', '聖主恩深漢文帝', '憐君不遣到長沙'), ('贈汪倫 白遊涇縣桃花潭. 村人汪倫常醞美酒以待白', '李白', '李白乘舟將欲行', '忽聞岸上踏歌聲', '桃花潭水深千尺', '不及汪倫送我情'), ('聞王昌齡左遷龍標遙有此寄', '李白', '楊花落盡([楊]州花落)子規啼', '聞道龍標過五谿', '我寄愁心與明月', '隨風直到夜郎西'), ('題情深樹寄象公', '李白', '腸斷枝上猿', '淚添山下樽', '白雲見我去', '亦為我飛翻'), ('口號 一作口號留別金陵諸公', '李白', '食出野田美', '酒臨遠水傾', '東流若未盡', '應見別離情'), ('別東林寺僧', '李白', '東林送客處', '月出白猿啼', '笑別廬山遠', '何煩過虎溪')]
1.3 实现search_poem函数,该函数打印你保存的指定作者的诗歌的标题,并返回一个list。
def search_poem(author,num = 20,printtitle = True):
if author not in poemSavedDict:
print("未储存该诗人的诗")
return [None]
else:
title_list = []
savedpoems = poemSavedDict[author]
for poem in savedpoems:
title_list.append(poem[0])
if printtitle:
print(title_list)
return title_list
search_poem("李白")
['登峴山亭寄晉陵張少府', '送朱大入秦', '結襪子', '玉階怨', '洛陽陌', '高句驪', '舍利弗', '靜夜思', '淥水曲', '估客行 一作樂', '峨眉山月歌', '東魯見狄博通', '贈華州王司士', '聞謝楊兒吟猛虎詞因此有贈', '巴陵贈賈舍人', '贈汪倫 白遊涇縣桃花潭. 村人汪倫常醞美酒以待白', '聞王昌齡左遷龍標遙有此寄', '題情深樹寄象公', '口號 一作口號留別金陵諸公', '別東林寺僧']
['登峴山亭寄晉陵張少府',
'送朱大入秦',
'結襪子',
'玉階怨',
'洛陽陌',
'高句驪',
'舍利弗',
'靜夜思',
'淥水曲',
'估客行 一作樂',
'峨眉山月歌',
'東魯見狄博通',
'贈華州王司士',
'聞謝楊兒吟猛虎詞因此有贈',
'巴陵贈賈舍人',
'贈汪倫 白遊涇縣桃花潭. 村人汪倫常醞美酒以待白',
'聞王昌齡左遷龍標遙有此寄',
'題情深樹寄象公',
'口號 一作口號留別金陵諸公',
'別東林寺僧']
第二部分 发布者-订阅者模式
实现 设计模式中的观察者模式,本部分将以第一部分中提取的诗歌信息作为主题。
观察者模式也被称为发布-订阅(Publish/Subscribe)模式。当这个主题对象状态变化时,会通知所有观察者对象并作出相应处理逻辑。
在本问题中,可以形象地理解成,Publisher为诗歌发布中心,Reader为订阅相应诗人的诗歌的人。需要实现订阅,退订,Publisher可以发布新增、删除诗歌的消息以及当前各位诗人的诗歌的总数。当Publisher发布消息时,它需要把需要推送给所有订阅的Reader。
Publisher(发布者)
- 保存订阅的读者
- 记录四位诗人各自诗歌的总数
- 发布四位诗人新诗的消息,每次只需要发布一首
- 发布新消息时,发布给所有已订阅的读者 只有一位发布者Publisher
Reader(订阅者)
- 订阅/取消订阅 发布者(注意同一个发布者不要重复订阅)
- 保存发布者发来的诗歌 关于保存消息,读者分为**两种类型**: - Type1:保存所有消息,这意味着这类读者需要将四位诗人的诗歌分类。 - Type2:只保存最新的消息(也就是说只需要保存一首诗)。
要求实例化三个Reader: Alice, Bob, Carol,其中Alice为Type1,Bob&Carol为Type2.
要求Reader实现printStatistics方法来打印保存的诗歌。
要求实现Publisher的__str__方法,输出自己现有的Reader和发出的诗歌数目。
下面给出的代码作为参考,可以不按照下面的参考实现。
参考资料
1. Observer pattern Wiki
2. 设计模式之观察者模式(c++)
2.1 完成上述Publisher & Reader的代码,先不需要考虑多进程
import random
class BasePublisher(object):
def __init__(self,name):
self.readers = []
self.publishername = name
def subscribeReader(self, reader):
if reader not in self.readers:
self.readers.append(reader)
else:
print("{}已订阅过。".format(reader))
def unsubscribeReader(self, reader):
try:
self.readers.remove(reader)
except:
print("{}尚未订阅,无法取消订阅。".format(reader))
def notifyReader(self,msggenerator):
raise NotImplementedError
def __str__(self):
raise NotImplementedError
class Publisher(BasePublisher):
#Poemtank = lb+ww+bjy+df
Poemtank = []
for pl in poemSavedDict.values():
Poemtank += pl
def __init__(self,name):
BasePublisher.__init__(self,name)
self.poemcount = {}
def __str__(self):
rdlist = []
totalpoemcount = 0
for r in self.readers:
rdlist.append(r.getname())
for p in self.poemcount.values():
totalpoemcount += p
return "{}的订阅人名单:{},合计更新{}首诗,其中{}".format(self.publishername,rdlist,totalpoemcount,self.poemcount)
def get_new_poem(self):
try:
p = self.Poemtank[random.randint(0,len(self.Poemtank)-1)]
self.Poemtank.remove(p)
for aut in authorSavedList:
if aut in p:
if aut not in self.poemcount:
self.poemcount[aut] = 1
else:
self.poemcount[aut] += 1
return p,aut
raise Exception
except:
print("Publisher没有新诗了")
return None,None
def notifyReader(self,poemgetter):
poem,author = poemgetter
for reader in self.readers:
reader.receivePoem(self.publishername,poem,author)
import threading
class BaseReader(object):
def subscribeToPublisher(self, publisher):
publisher.subscribeReader(self)
def unsubscribeToPublisher(self, publisher):
publisher.unsubscribeReader(self)
def __str__(self):
raise NotImplementedError
def receivePoem(self, publisher, poem , author):
print('thread id :{}'.format(threading.current_thread().name)) #如果3.2你使用多线程的话请保留此句,
#如果使用多进程的话请类似地输出进程id
raise NotImplementedError
def printStatistics(self):
# 打印消息
raise NotImplementedError
def getname(self):
raise NotImplementedError
class ReaderType1(BaseReader):
def __init__(self, _name):
BaseReader.__init__(self)
self.poemset = {}
self.readername = _name
self.newestpoem = None
def __str__(self):
try:
for v in self.poemset.values():
for p in v:
print("#####{}#####".format(self.readername))
for l in p:
print(l)
print(" ")
except:
print("{}没有收到新诗".format(self.readername))
finally:
return '##### END #####'
def receivePoem(self, publisher, poem, author):
print('thread id :{}'.format(threading.current_thread().name))
if poem == None:
print("Reader没有收到新诗")
else:
self.newestpoem = poem
if author in self.poemset:
self.poemset[author].append(poem)
else:
self.poemset[author] = [poem]
print("{}成功从{}处收取一首诗".format(self.readername,publisher))
def printStatistics(self):
try:
for v in self.poemset.values():
for p in v:
print("#####{}#####".format(self.readername))
for l in p:
print(l)
print(" ")
except:
print("{}没有收到新诗".format(self.readername))
def getname(self):
return self.readername
# 第二种读者
class ReaderType2(BaseReader):
def __init__(self, _name):
BaseReader.__init__(self)
self.readername = _name
self.newestpoem = None
def __str__(self):
try:
print("#####{}#####".format(self.readername))
for l in self.newestpoem:
print(l)
print(" ")
except:
print("{}没有收到新诗".format(self.readername))
finally:
return '##### END #####'
def receivePoem(self, publisher, poem , author):
print('thread id :{}'.format(threading.current_thread().name))
if poem == None:
print("{}没有收到新诗".format(self.readername))
print(' ')
else:
self.newestpoem = poem
print("{}成功从{}处收取一首诗".format(self.readername,publisher))
def printStatistics(self):
try:
print("#####{}#####".format(self.readername))
for l in self.newestpoem:
print(l)
print(" ")
except:
print("{}没有收到新诗".format(self.readername))
def getname(self):
return self.readername
Publisher = Publisher("Publisher")
Alice=ReaderType1('Alice')
Bob=ReaderType2('Bob')
Carol=ReaderType2('Carol')
Alice.subscribeToPublisher(Publisher)
Bob.subscribeToPublisher(Publisher)
## 请在这里利用Publisher任意发出几首诗来测试你的代码
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Bob成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Bob成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Bob成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Bob成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Bob成功从Publisher处收取一首诗
Alice.printStatistics()
Bob.printStatistics()
Carol.printStatistics()
print(Publisher)
#####Alice#####
靜夜思
李白
床前看月光
疑是地上霜
舉頭望明月
低頭思故鄉
#####Alice#####
八陣圖
諸葛亮八陣圖有三. 一在*。一在彌牟鎮。一在棋盤市。此在*之永安宮前者。
杜甫
功蓋三分國
名高八陣圖
江流石不轉
遺恨失吞吳
#####Alice#####
得房公池鵝
杜甫
房相西亭鵝一群
眠沙泛浦白於( 一作如) 雲
鳳皇池上應迴首
為報籠隨王右軍
#####Alice#####
鶴
白居易
人各有所好
物固無常宜
誰謂爾能舞
不如閒立時
#####Alice#####
輞川集 南垞
王維
輕舟南垞去
北垞淼難即
隔浦望人家
遙遙不相識
#####Bob#####
得房公池鵝
杜甫
房相西亭鵝一群
眠沙泛浦白於( 一作如) 雲
鳳皇池上應迴首
為報籠隨王右軍
#####Carol#####
Carol没有收到新诗
Publisher的订阅人名单:['Alice', 'Bob'],合计更新5首诗,其中{'李白': 1, '杜甫': 2, '白居易': 1, '王維': 1}
Carol.subscribeToPublisher(Publisher)
Bob.unsubscribeToPublisher(Publisher)
##再任意发出几首诗进行测试
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
Publisher.notifyReader(Publisher.get_new_poem())
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Carol成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Carol成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Carol成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Carol成功从Publisher处收取一首诗
thread id :MainThread
Alice成功从Publisher处收取一首诗
thread id :MainThread
Carol成功从Publisher处收取一首诗
Alice.printStatistics()
Bob.printStatistics()
Carol.printStatistics()
print(Publisher)
#####Alice#####
靜夜思
李白
床前看月光
疑是地上霜
舉頭望明月
低頭思故鄉
#####Alice#####
送朱大入秦
李白
遊人武陵去
寶劍直千金
分手脫相贈
平生一片心
#####Alice#####
淥水曲
李白
淥水明秋月( 一作日)
南湖采白蘋
荷花嬌欲語
愁殺蕩舟人
#####Alice#####
八陣圖
諸葛亮八陣圖有三. 一在*。一在彌牟鎮。一在棋盤市。此在*之永安宮前者。
杜甫
功蓋三分國
名高八陣圖
江流石不轉
遺恨失吞吳
#####Alice#####
得房公池鵝
杜甫
房相西亭鵝一群
眠沙泛浦白於( 一作如) 雲
鳳皇池上應迴首
為報籠隨王右軍
#####Alice#####
又於韋處乞大邑瓷碗
杜甫
大邑燒瓷輕且堅
扣如哀( 一作寒) 玉錦城傳
君家白碗勝霜雪
急送茅齋也可憐
#####Alice#####
鶴
白居易
人各有所好
物固無常宜
誰謂爾能舞
不如閒立時
#####Alice#####
晚望
白居易
江城寒角動
沙洲夕鳥還
獨在( 一作做) 高亭上
西南望遠山
#####Alice#####
輞川集 南垞
王維
輕舟南垞去
北垞淼難即
隔浦望人家
遙遙不相識
#####Alice#####
皇甫嶽雲溪雜題五首 鳥鳴澗
王維
人間桂花落
夜靜春山空
月出驚山鳥
時鳴春澗中
#####Bob#####
得房公池鵝
杜甫
房相西亭鵝一群
眠沙泛浦白於( 一作如) 雲
鳳皇池上應迴首
為報籠隨王右軍
#####Carol#####
晚望
白居易
江城寒角動
沙洲夕鳥還
獨在( 一作做) 高亭上
西南望遠山
Publisher的订阅人名单:['Alice', 'Carol'],合计更新10首诗,其中{'李白': 3, '杜甫': 3, '白居易': 2, '王維': 2}
2.2 修改Publisher部分代码,用多线程(或者多进程)的方式发送消息。本部分为选做部分。
class MultiThreadPublisher(BasePublisher):
#Poemtank = lb+ww+bjy+df
Poemtank = []
for pl in poemSavedDict.values():
Poemtank += pl
def __init__(self,name):
BasePublisher.__init__(self,name)
self.poemcount = {}
def __str__(self):
rdlist = []
totalpoemcount = 0
for r in self.readers:
rdlist.append(r.getname())
for p in self.poemcount.values():
totalpoemcount += p
return "{}的订阅人名单:{},合计更新{}首诗,其中{}".format(self.publishername,rdlist,totalpoemcount,self.poemcount)
def get_new_poem(self):
try:
p = self.Poemtank[random.randint(0,len(self.Poemtank)-1)]
self.Poemtank.remove(p)
for aut in authorSavedList:
if aut in p:
if aut not in self.poemcount:
self.poemcount[aut] = 1
else:
self.poemcount[aut] += 1
return p,aut
raise Exception
except:
print("Publisher没有新诗了")
return None,None
def notifyReader(self,poemgetter):
poem,author = poemgetter
for reader in self.readers:
reader.receivePoem(self.publishername,poem,author)
def startMultiTreadNotifier(self,MT = 5):
for _ in range(MT):
t = threading.Thread(target=self.notifyReader,args = (self.get_new_poem(),))
t.start()
t.join()
MultiThreadPublisher = MultiThreadPublisher("MultiPublisher")
Alice.subscribeToPublisher(MultiThreadPublisher)
Bob.subscribeToPublisher(MultiThreadPublisher)
Carol.subscribeToPublisher(MultiThreadPublisher)
print(Alice)
#####Alice#####
靜夜思
李白
床前看月光
疑是地上霜
舉頭望明月
低頭思故鄉
#####Alice#####
送朱大入秦
李白
遊人武陵去
寶劍直千金
分手脫相贈
平生一片心
#####Alice#####
淥水曲
李白
淥水明秋月( 一作日)
南湖采白蘋
荷花嬌欲語
愁殺蕩舟人
#####Alice#####
八陣圖
諸葛亮八陣圖有三. 一在*。一在彌牟鎮。一在棋盤市。此在*之永安宮前者。
杜甫
功蓋三分國
名高八陣圖
江流石不轉
遺恨失吞吳
#####Alice#####
得房公池鵝
杜甫
房相西亭鵝一群
眠沙泛浦白於( 一作如) 雲
鳳皇池上應迴首
為報籠隨王右軍
#####Alice#####
又於韋處乞大邑瓷碗
杜甫
大邑燒瓷輕且堅
扣如哀( 一作寒) 玉錦城傳
君家白碗勝霜雪
急送茅齋也可憐
#####Alice#####
鶴
白居易
人各有所好
物固無常宜
誰謂爾能舞
不如閒立時
#####Alice#####
晚望
白居易
江城寒角動
沙洲夕鳥還
獨在( 一作做) 高亭上
西南望遠山
#####Alice#####
輞川集 南垞
王維
輕舟南垞去
北垞淼難即
隔浦望人家
遙遙不相識
#####Alice#####
皇甫嶽雲溪雜題五首 鳥鳴澗
王維
人間桂花落
夜靜春山空
月出驚山鳥
時鳴春澗中
##### END #####
##请发出几首诗测试
# MT = X:发出X首诗
MultiThreadPublisher.startMultiTreadNotifier(MT = 5)
thread id :Thread-6
Alice成功从MultiPublisher处收取一首诗
thread id :Thread-6
Bob成功从MultiPublisher处收取一首诗
thread id :Thread-6
Carol成功从MultiPublisher处收取一首诗
thread id :Thread-7
Alice成功从MultiPublisher处收取一首诗
thread id :Thread-7
Bob成功从MultiPublisher处收取一首诗
thread id :Thread-7
Carol成功从MultiPublisher处收取一首诗
thread id :Thread-8
Alice成功从MultiPublisher处收取一首诗
thread id :Thread-8
Bob成功从MultiPublisher处收取一首诗
thread id :Thread-8
Carol成功从MultiPublisher处收取一首诗
thread id :Thread-9
Alice成功从MultiPublisher处收取一首诗
thread id :Thread-9
Bob成功从MultiPublisher处收取一首诗
thread id :Thread-9
Carol成功从MultiPublisher处收取一首诗
thread id :Thread-10
Alice成功从MultiPublisher处收取一首诗
thread id :Thread-10
Bob成功从MultiPublisher处收取一首诗
thread id :Thread-10
Carol成功从MultiPublisher处收取一首诗
Alice.printStatistics()
Bob.printStatistics()
Carol.printStatistics()
print(MultiThreadPublisher)
#####Alice#####
靜夜思
李白
床前看月光
疑是地上霜
舉頭望明月
低頭思故鄉
#####Alice#####
送朱大入秦
李白
遊人武陵去
寶劍直千金
分手脫相贈
平生一片心
#####Alice#####
淥水曲
李白
淥水明秋月( 一作日)
南湖采白蘋
荷花嬌欲語
愁殺蕩舟人
#####Alice#####
別東林寺僧
李白
東林送客處
月出白猿啼
笑別廬山遠
何煩過虎溪
#####Alice#####
贈汪倫 白遊涇縣桃花潭. 村人汪倫常醞美酒以待白
李白
李白乘舟將欲行
忽聞岸上踏歌聲
桃花潭水深千尺
不及汪倫送我情
#####Alice#####
八陣圖
諸葛亮八陣圖有三. 一在*。一在彌牟鎮。一在棋盤市。此在*之永安宮前者。
杜甫
功蓋三分國
名高八陣圖
江流石不轉
遺恨失吞吳
#####Alice#####
得房公池鵝
杜甫
房相西亭鵝一群
眠沙泛浦白於( 一作如) 雲
鳳皇池上應迴首
為報籠隨王右軍
#####Alice#####
又於韋處乞大邑瓷碗
杜甫
大邑燒瓷輕且堅
扣如哀( 一作寒) 玉錦城傳
君家白碗勝霜雪
急送茅齋也可憐
#####Alice#####
鶴
白居易
人各有所好
物固無常宜
誰謂爾能舞
不如閒立時
#####Alice#####
晚望
白居易
江城寒角動
沙洲夕鳥還
獨在( 一作做) 高亭上
西南望遠山
#####Alice#####
出關路
白居易
山川函穀路
塵土遊子顏
蕭條去國意
秋風生故關
#####Alice#####
輞川集 南垞
王維
輕舟南垞去
北垞淼難即
隔浦望人家
遙遙不相識
#####Alice#####
皇甫嶽雲溪雜題五首 鳥鳴澗
王維
人間桂花落
夜靜春山空
月出驚山鳥
時鳴春澗中
#####Alice#####
皇甫嶽雲溪雜題五首 蓮花塢
王維
日日采蓮去
洲長多暮歸
弄篙莫濺水
畏溼紅蓮衣
#####Alice#####
輞川集 茱萸沜 (沜。普半切。義與三半通)
王維
結實紅且綠
復如花更開
山中儻留客
置此芙蓉( 一作茱萸) 杯
#####Bob#####
贈汪倫 白遊涇縣桃花潭. 村人汪倫常醞美酒以待白
李白
李白乘舟將欲行
忽聞岸上踏歌聲
桃花潭水深千尺
不及汪倫送我情
#####Carol#####
贈汪倫 白遊涇縣桃花潭. 村人汪倫常醞美酒以待白
李白
李白乘舟將欲行
忽聞岸上踏歌聲
桃花潭水深千尺
不及汪倫送我情
MultiPublisher的订阅人名单:['Alice', 'Bob', 'Carol'],合计更新5首诗,其中{'王維': 2, '白居易': 1, '李白': 2}