簡體   English   中英

如何從python / Django的xml解析中刪除選擇字符?

[英]How to remove select characters from xml parse in python / django?

上下文

我正在處理django項目,我需要遍歷嵌套字典以打印值

這是字典:

{body {u'@ copyright':u'所有數據版權Unitrans ASUCD /戴維斯市2015。',u'predictions':{u'@ routeTitle':u'A',u'@ dirTitleBecauseNoPredictions':u'Outbound到El Cemonte',u'@ agencyTitle':u'Unitrans ASUCD /戴維斯市',u'@ stopTag':u'22258',u'@ stopTitle':u'Silo碼頭和哈林大廳(WB)', u'@ routeTag':u'A',u'message':[{u'@ text':u'周末服務於12月28日至30日星期一至星期三運行。',u'@ priority':u'正常'},{u'@ text':u'A行和Z行不在周末運行。 使用O線進行周末服務。',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服務正在12月28日至30日的周一至周三運行。',u'@ priority':u'Normal'},{u'@ text':u'A行和Z線不在周末運行。 使用O線進行周末服務。',u'@ 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)

我想在網頁預測中顯示的內容

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

對於這個問題,我將不勝感激。 感謝您的時間。

在xmltodict中,“ @”符號用於指示xml節點的屬性,而“ [”和“]”用於定界本身就是值列表的元素值。 (在這里,它指示'message'值本身就是兩個消息對象的列表)。 您當然可以嘗試將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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM