2011-09-14 62 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变量包含一个列表,并且这是打印列表的表示形式。 –