如何从python / django中的xml解析中删除选择的字符?

时间:2015-12-29 00:17:28

标签: python django dictionary xml-parsing

上下文

我正在开发一个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

我很感激对此问题的任何意见。谢谢你的时间。

1 个答案:

答案 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>