2011-09-14 61 views
0

我有我加載在我views.py文件外部XML文件如何在XML文檔中從Django/Python中的XML標籤中提取數據?

def test(request): 

    url = urllib2.urlopen("http://someurl.com?xml") 
    dom = minidom.parse(url) 

    groups = dom.getElementsByTagName("group") 

    deal_holder = [] 

    # Iterate over each DOM group element: 
    for group in groups: 
     # Iterate over each child node 
     for groupChild in group.childNodes: 
      deal_holder.append(groupChild) 

    return render_to_response('folder/test.html', {'deal_holder':deal_holder}) 

這是加載XML文件的樣子:

<page> 
    <site> 
     <siteid>25550</siteid> 
     <sitename> 
      <![CDATA[ Some Text Here ]]> 
     </sitename> 
     <sitelink> 
      http://somelinkehere.com 
     </sitelink> 
     <timezone> 
      <![CDATA[ Pacific Time ]]> 
     </timezone> 
    </site> 
    <groups> 
     <enablefeaturedgroup>OFF</enablefeaturedgroup> 
     <group> 
      <groupid>467246</groupid> 
      <groupname> 
       <![CDATA[ Today's Deal ]]> 
      </groupname> 
      <groupdescription> 
       <![CDATA[ ]]> 
      </groupdescription> 
      </group> 
      <group> 
      <groupid>467247</groupid> 
      <groupname> 
       <![CDATA[ Past Deals ]]> 
      </groupname> 
      <groupdescription> 
       <![CDATA[ ]]> 
      </groupdescription> 
     </group> 
    </groups> 
</page> 

的問題是,所有的例子我已經看到使用類似我正在使用的東西,除了他們通常具有這樣的XML標籤:<weather:forecast day="Wed" date="14 Sep 2011" low="56" high="72" text="AM Clouds/PM Sun" code="30"/>,並能夠從像day="Wed"date="14 Sep 2011"low="56"等等東西檢索信息,但我想要檢索的信息其實是介於een的標籤,如<siteid>25550</siteid>

任何意見或信息將不勝感激。

回答

1

隨着lxml你可以做這樣的事情:

import lxml.etree 

tree = lxml.etree.parse("http://someurl.com") 
sites = tree.xpath("//site") 

for site in sites: 
    siteid = site.find("siteid").text 
    print siteid 
+0

如果我使用外部XML源,這將如何工作? – bigmike7801

+0

還有什麼你想要做的,我的例子不包括? – Acorn

+0

我無法獲得lxml.etree導入,我不確定是否可以將其安裝在我的服務器上。另外,你是否介意從你的例子中刪除實際的URL?我一定是誤會了它。 Thnks! – bigmike7801

2

使用minidom命名頗爲相似的JavaScript。

from xml.dom import minidom 
from StringIO import StringIO 
a = """<page> 
    <site> 
     <siteid>25550</siteid> 
     <sitename> 
      <![CDATA[ Some Text Here ]]> 
     </sitename> 
     <sitelink> 
      http://somelinkehere.com 
     </sitelink> 
     <timezone> 
      <![CDATA[ Pacific Time ]]> 
     </timezone> 
    </site> 
    <groups> 
     <enablefeaturedgroup>OFF</enablefeaturedgroup> 
     <group> 
      <groupid>467246</groupid> 
      <groupname> 
       <![CDATA[ Today's Deal ]]> 
      </groupname> 
      <groupdescription> 
       <![CDATA[ ]]> 
      </groupdescription> 
      </group> 
      <group> 
      <groupid>467247</groupid> 
      <groupname> 
       <![CDATA[ Past Deals ]]> 
      </groupname> 
      <groupdescription> 
       <![CDATA[ ]]> 
      </groupdescription> 
     </group> 
    </groups> 
</page> 
""" 
tree = minidom.parse(StringIO(a)) 
groups = tree.getElementsByTagName("group") 

使用StringIO如果您使用的urllib不是必需的,因爲minidomparse方法需要一個類文件對象(urllib.urlopen只返回)。

我建議不要將此列表傳遞給django模板系統。你應該進一步解析它。

# Iterate over each DOM group element: 
group_dictionaries = [] 
for group in groups: 
    group_dict = {} 
    # Iterate over each child node 
    # instead of for loop maybe print groupChildNodes[0] for groupid 
    # print groupChildNodes[1] for groupname 
    for groupChild in group.ChildNodes: 
     # do something with each node 
     group_dict[groupChild.tagName] = groupChild.data 
    group_dictionaries.append(group_dict) 

    Now in the template: 
    {% for group in group_dictionaries %} 
     {{ group.groupid }} 
     {{ group.groupname }} 
     etc. 
    {% endfor %} 

您可以將它們的值保存在字典列表中。

+0

因爲我使用的是django,所以我做了data = dom.getElementsByTagName(「group」),然後將'data'變量傳遞給模板,在模板中我做'{{data}}'輸出'1 - [)。我如何能夠從諸如'groupid'或'groupname'中檢索任何數據謝謝! – bigmike7801

+0

我更新了上面的代碼,以反映我根據您的建議所做的一些更改。但問題是,在我的'template'文件中,我添加了{{deal_holder}}並輸出了[[DOM Text node'「>,」,」, ,等等]'所以我仍然無法只抓取信息。我對python/django很新,所以我可能會漏掉一些明顯的東西。謝謝你的幫助。 – bigmike7801

+0

看到我的編輯。發生這種情況是因爲您的deal_holder變量包含一個列表,並且這是打印列表的表示形式。 –