上下文
我正在开发一个django项目,我需要循环遍历嵌套字典来打印值
这是字典:
{body {u'@ copyright':u'所有数据版权Unitrans ASUCD /戴维斯城2015.',u'predictions':{u'@ routeTitle':u'A',u'@ dirTitleBecauseNoPredictions': u'Outbound to El Cemonte',u'@ agencyTitle':u'Unitrans ASUCD / City of Davis',u'@ stopTag':u'22258',u'@ stopTitle':u'Silo Terminal& Haring Hall(WB)',u'@ routeTag':u'A',u'message':[{u'@ text':u'Weekend服务于周一至周三12月28日至30日运行。',你' @priority':u'Normal'},{u'@ text':你的A线和Z线不会在周末运行。使用O-line进行周末服务。',''@ priority':u'Normal'}]}}}
我正在从以下网址解析字典: http://webservices.nextbus.com/service/publicXMLFeed?command=predictions&a=unitrans&r=A&s=22258
问题1
我在使用django模板标签显示带有'@'的键值时遇到问题,例如
{% for i in data%}
{% i.@copyright %}
{% endfor %}
这给出了一个错误,说无法解析余数。
问题2
其中一个值的嵌套字典带有方括号
[{u'@ text':u'Weekend服务正在周一至周三12月28日至30日举行。',''优先级':u'Normal'},{u'@ text':u'The A线和Z线不在周末运行。使用O-line进行周末服务。',''@ priority':u'Normal'}]
我无法使用for循环模板标记循环使用
我想到的解决方案
为了解决这个问题并使其更简单,我希望从xml中删除字符'@'
,'['
和']'
,这会给我留下一个更简单的字典,很容易循环。
我的Python代码现在在views.py
import xmltodict
import requests
def prediction(request, line, s_id):
url = "http://webservices.nextbus.com/service/publicXMLFeed? command=predictions&a=unitrans&r=" + line + "&s=" + s_id
data = requests.get(url)
data = xmltodict.parse(data, dict_constructor=dict)
data_dict = {}
data_dict["data"] = data
return render(request, 'routes/predictions.html', data_dict)
我希望在页面predictions.html上显示
Route Tag: A
Message : Weekend Service is running Monday-Wednesday Dec. 28-30.
The A-Line and Z-Line do not run on weekends. use O-Line for weekend service.
Priority: Normal
我很感激对此问题的任何意见。谢谢你的时间。
答案 0 :(得分:0)
在xmltodict中,'@'符号用于表示xml节点的属性,'['和']'用于分隔元素值,这些元素值本身就是值列表。 (这里,它表示'message'值本身就是两个消息对象的列表)。你当然可以尝试在dict中读取原始文本并删除你需要的内容,但这并不会利用大多数人开始导入它的原因:组织数据并使其更容易访问。 / p>
您可以轻松地制作一个模板,而不是抓取文本,只需从您想要的字典中提取特定值。您的数据字典应该是这样的结构:
{
body:
{
u'@copyright': u'All data copyright Unitrans ASUCD/City of Davis 2015.',
u'predictions':
{
u'@routeTitle': u'A',
u'@dirTitleBecauseNoPredictions': u'Outbound to El Cemonte',
u'@agencyTitle': u'Unitrans ASUCD/City of Davis',
u'@stopTag': u'22258',
u'@stopTitle': u'Silo Terminal & Haring Hall (WB)',
u'@routeTag': u'A',
u'message':
[
{
u'@text': u'Weekend service is running Monday-Wednesday Dec. 28-30.',
u'@priority': u'Normal'
},
{
u'@text': u'The A-line and Z-line do not run on weekends. Use O-line for weekend service.',
u'@priority': u'Normal'
}
]
}
}
}
要获得所需的输出,请创建为此数据量身定制的模板,然后直接插入所需的值。这样的事情:(道歉,我完全不知道django模板语法)
Route Tag: {{ data_dict.body.predictions.routeTitle }}
Messages :
<ul>
{% for msg in data_dict.body.predictions.message %}
<li>{{ msg.text }} (Priority: {{ msg.priority }})</li>
{% endfor %}
</ul>