Avatar billede j4k0b Nybegynder
30. marts 2007 - 15:27 Der er 6 kommentarer og
1 løsning

Python & XML

Greetings fellow browsers,

Jeg står overfor at skulle bygge en XML cache funktion på en hjemmeside, hvor både forum tråde, nyheder osv. skal gemmes i XML dokumenter for at spare på kald til postgreSQL serveren.

Hjemmesiden er programmeret i Python, og derfor skal nedestående naturligvis også udarbejdes i Python. Det skal siges at jeg aldrig har arbejdet med XML parsing før, hverken i Python eller noget andet sprog.

Da det er vidt forskelligt hvad der skal gemmes i og hentes fra XML dokumenterne, alt efter hvilken del af sitet der arbejdes på, søger jeg en funktion eller et script som kan læse og automatisk opdele XML dokumentet i Dictionaries og Lists med navne tilsvarende dem fra XML.

At skrive til XML dokumenterne løser jeg selv, da dette nok ikke kan automatiseres på helt samme måde.

Jeg håber nogen kan enten smide et stykke kode, eller et link :-)


På forhånd tak.
Avatar billede j4k0b Nybegynder
30. marts 2007 - 16:55 #1
Hertil skal det lige tilføjes at det kun lister der skal gemmes i XML og genbruges til Feeds (forum view, nyheds arkiv mv.), ikke hvert enkel topic, da alt andet nok ikke være mere CPU krævende.
Avatar billede arne_v Ekspert
31. marts 2007 - 05:19 #2
nu giver du jo ikke detaljer om hvad du vil

men her er 2 små stumper Python i "hello world" klassen
Avatar billede arne_v Ekspert
31. marts 2007 - 05:20 #3
<?xml version="1.0"?>
<all>
  <one>a</one>
  <one>bb</one>
  <one>ccc</one>
</all>

import xml.dom.minidom
from xml.dom.minidom import parse
doc = parse("testpy.xml")
all = []
for n in doc.getElementsByTagName("one"):
    all.append(n.childNodes[0].nodeValue)
for one in all:
    print one
Avatar billede arne_v Ekspert
31. marts 2007 - 05:20 #4
<?xml version="1.0"?>
<all>
  <one k="1">a</one>
  <one k="2">bb</one>
  <one k="3">ccc</one>
</all>

import xml.dom.minidom
from xml.dom.minidom import parse
doc = parse("testpy2.xml")
all = {}
for n in doc.getElementsByTagName("one"):
    all[n.attributes["k"].value] = n.childNodes[0].nodeValue
for k,v in all.iteritems():
    print k,":",v
Avatar billede j4k0b Nybegynder
31. marts 2007 - 08:48 #5
Hej arne, tak for dit svar.

Jeg er ude efter et stykke kode som kan parse et xml ark af ukendt opbygning (feks eksemplet nedenfor) og returnerer strukturen af arket i Lists/Dicts med nøgler der matcher XML arkets tags, så strukturen er intakt. Nederst er Python resultatet af dette eksempel:

<forumtopic>
    <description>
        <id>1234</id>
        <headline>Hjælp mig</headline>
        <date>14/05/2007</date>
        <time>14:22</time>
        <author>Jakob</author>
        <author_id>1234</author_id>
        <message>Hjælp jeg har problemer med...</message>
    </description>

    <replies>
        <reply>
            <id>4321</id>
            <date>15/05/2007</date>
            <time>15:05</time>
            <author>Morten</author>
            <author_id>4272</author_id>
            <message>du kan muligvis....</message>
        </reply>

        <reply>
            <id>4321</id>
            <date>15/05/2007</date>
            <time>15:05</time>
            <author>Morten</author>
            <author_id>4272</author_id>
            <message>du kan muligvis....</message>
        </reply>

        ....

    </replies>
</forumtopic>

{'forumtopic' : {
    'description' : {
        'id' : 1234,
        'headline' : 'Hjælp mig',
        'date' : '14/05/2007',
        'time' : '14:22',
        'author' : 'Jakob',
        'author_id' : '1234',
        'message' : 'Hjælp jeg har problemer med...',
    },
    'replies' : [
        {'id' : '4321',
        'date' : '15/05/2007',
        'time' : '15:05',
        'author' : 'Morten',
        'author_id' : '4272',
        'message' : 'du kan muligvis....',
        },
        {'id' : '4321',
        'date' : '15/05/2007',
        'time' : '15:05',
        'author' : 'Morten',
        'author_id' : '4272',
        'message' : 'du kan muligvis....',
        },
    ]
}



--------

XML ark, der tilhører andre steder på sitet end forummet, har en hel anden opbygning end dette. Derfor skal funktionen automatisk finde frem til navne på tags (attributes er ikke nødvendig) og gemme dem i strukturen der returneres. Læg mærke til hvordan hvert repli-tag bliver lagt ind i en liste i stedet for at overskrive sig selv, dette skal ske hver gang der er tags som gentager sig selv (havde der kun været 1 svar på tråden kan den selvfølgelig ikke vide det.
Avatar billede arne_v Ekspert
01. april 2007 - 04:20 #6
det kan ikke bruges helt generelt

<supertag><subtag>...</subtag><subtag>...</subtag><subtag>...</subtag></supertag>
->
list

<supertag><subtag1>...</subtag1><subtag2>...</subtag2><subtag3>...</subtag3></supertag>
->
map

er simple nok

det problem du beskriver

<supertag><subtag>...</subtag></supertag>

er ikke et stort problem - både list og map kan bruge

de store problemer er

<supertag><subtag1>...</subtag1><subtag1>...</subtag1><subtag2>...</subtag2><subtag2>...</subtag2></supertag>

og

<supertag><subtag1>...</subtag1><subtag2>...</subtag2><subtag1>...</subtag1><subtag2>...</subtag2></supertag>
Avatar billede j4k0b Nybegynder
04. april 2007 - 08:29 #7
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester