Как вытащить данные из документа XML между тегами XML в Django / Python? - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть внешний XML-файл, который я загружаю в мой views.py файл

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" и т. Д. ... но информация, которую я хочу получить, на самом деле находится между тегами, такими как <siteid>25550</siteid>

Буду признателен за любые советы или информацию.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

Использование 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, потому что parse метод minidom ожидает файловый объект (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 %}

Вы можете сохранить их значения в списке словарей.

1 голос
/ 14 сентября 2011

С 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
...