如何在python/Django中从xml解析中删除select字符?

2024-10-03 21:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我在一个django项目中工作,我需要通过一个嵌套字典来打印值

这是字典:

{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'}]}}}

我正在从以下url解析词典: 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 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'}]

我不能使用for loop模板标记循环这个

我想到的解决方案

为了解决这个问题并使它更简单,我希望从xml中去掉字符'@''['']',这将给我留下一个更简单的字典,可以很容易地循环使用。你知道吗

我的Python代码现在在视图.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)

我想在页面上显示的内容预测.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

如果您能就这个问题提供任何意见,我将不胜感激。谢谢你抽出时间。你知道吗


Tags: textfordata字典isservicelinerunning
1条回答
网友
1楼 · 发布于 2024-10-03 21:24:31

在xmltodict中,“@”符号用于指示xml节点的属性,“[”和“]”用于分隔元素值,而元素值本身就是一个值列表。(这里,它表示“message”值本身是两个message对象的列表)。你当然可以试着把dict作为原始文本读入,然后把你需要的东西刮出来,但这并不能利用大多数人导入dict的理由:组织数据并使其更容易访问。你知道吗

您可以轻松地创建一个模板,只需从dict中提取所需的特定值,而无需刮除文本。数据dict的结构应如下所示:

{
    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>

相关问题 更多 >